/ Hex Artifact Content
Login

Artifact 75258853624ec5fba72039f87397b3d88c586fa1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 31 38 20 32  eaux.c,v 1.418 2
02c0: 30 30 38 2f 31 31 2f 30 35 20 31 37 3a 34 31 3a  008/11/05 17:41:
02d0: 31 39 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  19 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: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  p->readOnly = 1;
1c10: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
1c20: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66 6f 72  urnal = 0;.  for
1c30: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
1c40: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
1c50: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
1c60: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
1c70: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66  >opcode;..    if
1c80: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e  ( opcode==OP_Fun
1c90: 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d  ction || opcode=
1ca0: 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20  =OP_AggStep ){. 
1cb0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35       if( pOp->p5
1cc0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
1cd0: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a  Args = pOp->p5;.
1ce0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cf0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1d00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1d10: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
1d20: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
1d30: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
1d40: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
1d50: 2d 3e 70 32 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ->p2;.#endif.   
1d60: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64   }.    if( opcod
1d70: 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20  e==OP_Halt ){.  
1d80: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d      if( pOp->p1=
1d90: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
1da0: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
1db0: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
1dc0: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
1dd0: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1de0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1df0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  if( opcode==OP_S
1e00: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
1e10: 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65    hasStatementBe
1e20: 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  gin = 1;.      p
1e30: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
1e40: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 1;.    }else
1e50: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1e60: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20  Destroy ){.     
1e70: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1e80: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
1e90: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1ea0: 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  ==OP_Transaction
1eb0: 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29   && pOp->p2!=0 )
1ec0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f  {.      p->readO
1ed0: 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  nly = 0;.#ifndef
1ee0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1ef0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
1f00: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1f10: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
1f20: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
1f30: 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74   ){.      doesSt
1f40: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1f50: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
1f60: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46  f( opcode==OP_VF
1f70: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69  ilter ){.      i
1f80: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  nt n;.      asse
1f90: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
1fa0: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  = 3 );.      ass
1fb0: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
1fc0: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
1fd0: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70  );.      n = pOp
1fe0: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-1].p1;.      i
1ff0: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
2000: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65  nMaxArgs = n;.#e
2010: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2020: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4f  if( sqlite3VdbeO
2030: 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79  pcodeHasProperty
2040: 28 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a  (opcode, OPFLG_J
2050: 55 4d 50 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c  UMP) && pOp->p2<
2060: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
2070: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d  t( -1-pOp->p2<p-
2080: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
2090: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
20a0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
20b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
20c0: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
20d0: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d  p->aLabel);.  p-
20e0: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20  >aLabel = 0;..  
20f0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20  *pMaxFuncArgs = 
2100: 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f 2a 20  nMaxArgs;..  /* 
2110: 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c  If we never roll
2120: 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
2130: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2140: 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  en statement.  *
2150: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  * transactions a
2160: 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  re not needed.  
2170: 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20  So change every 
2180: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a  OP_Statement.  *
2190: 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e  * opcode into an
21a0: 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20   OP_Noop.  This 
21b0: 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20  avoid a call to 
21c0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
21d0: 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68  lusive().  ** wh
21e0: 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ich can be expen
21f0: 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61  sive on some pla
2200: 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69  tforms..  */.  i
2210: 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  f( hasStatementB
2220: 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61  egin && !doesSta
2230: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29  tementRollback )
2240: 7b 0a 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d  {.    p->usesStm
2250: 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  tJournal = 0;.  
2260: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
2270: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
2280: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
2290: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
22a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65  opcode==OP_State
22b0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
22c0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
22d0: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  _Noop;.      }. 
22e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
22f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
2300: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2310: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2320: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
2330: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
2340: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
2350: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
2360: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2370: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
2380: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
2390: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
23a0: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
23b0: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
23c0: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
23d0: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
23e0: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
23f0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
2400: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2410: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
2420: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
2430: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
2440: 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64   *aOp){.  int ad
2450: 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  dr;.  assert( p-
2460: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2470: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
2480: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
2490: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20  p->nOpAlloc ){. 
24a0: 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79     resizeOpArray
24b0: 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  (p, p->nOpAlloc 
24c0: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
24d0: 3a 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  : 1024/sizeof(Op
24e0: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
24f0: 70 2d 3e 6e 4f 70 2b 6e 4f 70 3c 3d 70 2d 3e 6e  p->nOp+nOp<=p->n
2500: 4f 70 41 6c 6c 6f 63 20 7c 7c 20 70 2d 3e 64 62  OpAlloc || p->db
2510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2520: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64  ;.  }.  if( p->d
2530: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2540: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2550: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
2560: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e  >nOp;.  if( nOp>
2570: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
2580: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
2590: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
25a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25b0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
25c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
25d0: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
25e0: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
25f0: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
2600: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
2610: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
2620: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
2630: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
2640: 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 73 71    if( p2<0 && sq
2650: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48  lite3VdbeOpcodeH
2660: 61 73 50 72 6f 70 65 72 74 79 28 70 4f 75 74 2d  asProperty(pOut-
2670: 3e 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a  >opcode, OPFLG_J
2680: 55 4d 50 29 20 29 7b 0a 20 20 20 20 20 20 20 20  UMP) ){.        
2690: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
26a0: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
26b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26c0: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
26d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
26e0: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
26f0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
2700: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
2710: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
2720: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
2730: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
2740: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2750: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
2760: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  mment = 0;.     
2770: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
2780: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
2790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27a0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
27b0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
27c0: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
27d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
27e0: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
27f0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
2800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2810: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2820: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P1 operand for
2830: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2840: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
2850: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
2860: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
2870: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
2880: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
2890: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
28a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
28b0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
28c0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
28d0: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
28e0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
28f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2900: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
2910: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
2920: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
2930: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
2940: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2950: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
2960: 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e  & addr>=0 && p->
2970: 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61  nOp>addr && p->a
2980: 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  Op ){.    p->aOp
2990: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
29a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
29b0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
29c0: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
29d0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
29e0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
29f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a00: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
2a10: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
2a20: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
2a30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a40: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
2a50: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2a60: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
2a70: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
2a80: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2a90: 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d   if( p && addr>=
2aa0: 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72  0 && p->nOp>addr
2ab0: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
2ac0: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
2ad0: 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  2 = val;.  }.}..
2ae0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2af0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33   value of the P3
2b00: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
2b10: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
2b20: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2b30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
2b40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2b50: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2b60: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2b70: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2b80: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2b90: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
2ba0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
2bb0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2bc0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20  p->aOp[addr].p3 
2bd0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2be0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2bf0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f  alue of the P5 o
2c00: 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d  perand for the m
2c10: 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  ost recently.** 
2c20: 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e  added operation.
2c30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
2c50: 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20  e *p, u8 val){. 
2c60: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2c70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2c80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2c90: 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20  if( p && p->aOp 
2ca0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2cb0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
2cc0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
2cd0: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
2ce0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2cf0: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
2d00: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
2d10: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2d20: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
2d30: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2d40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2d50: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
2d60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
2d70: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
2d80: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
2d90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2da0: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
2db0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
2dc0: 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66  he input FuncDef
2dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70   structure is ep
2de0: 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72  hemeral, then fr
2df0: 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  ee it.  If.** th
2e00: 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74  e FuncDef is not
2e10: 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20   ephermal, then 
2e20: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73  do nothing..*/.s
2e30: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45  tatic void freeE
2e40: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
2e50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
2e60: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
2e70: 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65  if( pDef && (pDe
2e80: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
2e90: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
2ea0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2eb0: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
2ec0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
2ed0: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20  lete a P4 value 
2ee0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
2ef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2f00: 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eP4(sqlite3 *db,
2f10: 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69   int p4type, voi
2f20: 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34  d *p4){.  if( p4
2f30: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
2f40: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
2f50: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20  case P4_REAL:.  
2f60: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
2f70: 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  4:.      case P4
2f80: 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20  _MPRINTF:.      
2f90: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
2fa0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
2fb0: 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61  EYINFO:.      ca
2fc0: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a  se P4_INTARRAY:.
2fd0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
2fe0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b  YINFO_HANDOFF: {
2ff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3000: 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a  DbFree(db, p4);.
3010: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3030: 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b  e P4_VDBEFUNC: {
3040: 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e  .        VdbeFun
3050: 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28  c *pVdbeFunc = (
3060: 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20  VdbeFunc *)p4;. 
3070: 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d         freeEphem
3080: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c  eralFunction(db,
3090: 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e   pVdbeFunc->pFun
30a0: 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  c);.        sqli
30b0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
30c0: 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20  Data(pVdbeFunc, 
30d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
30e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56  te3DbFree(db, pV
30f0: 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  dbeFunc);.      
3100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3110: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46  .      case P4_F
3120: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
3130: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
3140: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
3150: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
3160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3170: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3180: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MEM: {.        s
3190: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
31a0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
31b0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
31c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
31d0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
31e0: 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73  Change N opcodes
31f0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64   starting at add
3200: 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a  r to No-ops..*/.
3210: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3220: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
3230: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3240: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
3250: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
3260: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
3270: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3280: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3290: 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65  p->db;.    while
32a0: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66  ( N-- ){.      f
32b0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
32c0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
32d0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
32e0: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
32f0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70  Op[0]));.      p
3300: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
3310: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b  Noop;.      pOp+
3320: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
3330: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3340: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
3350: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
3360: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
3370: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
3380: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
3390: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
33a0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
33b0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
33c0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
33d0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
33e0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
33f0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
3400: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
3410: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
3420: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
3430: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
3440: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
3450: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
3460: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
3470: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
3480: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
3490: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
34a0: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
34b0: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
34c0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
34d0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
34e0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
34f0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
3500: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
3510: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
3520: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
3530: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
3540: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
3550: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
3560: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
3570: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
3580: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
3590: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
35a0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
35b0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
35c0: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
35d0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
35e0: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
35f0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
3600: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
3610: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
3620: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
3630: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
3640: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
3650: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
3660: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3670: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
3680: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
3690: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
36a0: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
36b0: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
36c0: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
36d0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
36e0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
36f0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
3700: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
3710: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
3720: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
3730: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
3740: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
3750: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
3760: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
3770: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
3780: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
3790: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
37a0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
37b0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
37c0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
37d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
37e0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
37f0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
3800: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3810: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
3820: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
3830: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
3840: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
3850: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
3860: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
3870: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
3880: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3890: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
38a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
38b0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
38c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
38d0: 28 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  (n != P4_KEYINFO
38e0: 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  ) {.      freeP4
38f0: 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a  (db, n, (void*)*
3900: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
3910: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b     }.    return;
3920: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
3930: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
3940: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
3950: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
3960: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
3970: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
3980: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
3990: 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50  p[addr];.  freeP
39a0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
39b0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
39c0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
39d0: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
39e0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
39f0: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
3a00: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
3a10: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
3a20: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
3a30: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
3a40: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
3a50: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
3a60: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
3a70: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
3a80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
3a90: 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 20  pe = n;.  }else 
3aa0: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
3ab0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
3ac0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3ad0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
3ae0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
3af0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
3b00: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
3b10: 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  o;.    int nFiel
3b20: 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  d, nByte;..    n
3b30: 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66  Field = ((KeyInf
3b40: 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b  o*)zP4)->nField;
3b50: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
3b60: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b  eof(*pKeyInfo) +
3b70: 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65   (nField-1)*size
3b80: 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of(pKeyInfo->aCo
3b90: 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b  ll[0]) + nField;
3ba0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
3bb0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
3bc0: 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d  Byte );.    pOp-
3bd0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  >p4.pKeyInfo = p
3be0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28  KeyInfo;.    if(
3bf0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
3c00: 20 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65     u8 *aSortOrde
3c10: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
3c20: 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e  pKeyInfo, zP4, n
3c30: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f  Byte);.      aSo
3c40: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
3c50: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a  fo->aSortOrder;.
3c60: 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f        if( aSortO
3c70: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
3c80: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3c90: 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  rder = (unsigned
3ca0: 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f   char*)&pKeyInfo
3cb0: 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b  ->aColl[nField];
3cc0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
3cd0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3ce0: 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72  rder, aSortOrder
3cf0: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  , nField);.     
3d00: 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34   }.      pOp->p4
3d10: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
3d20: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
3d30: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
3d40: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
3d50: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3d60: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
3d70: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
3d80: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
3d90: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
3da0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
3db0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
3dc0: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
3dd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
3de0: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
3df0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
3e00: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3e10: 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = n;.  }else{. 
3e20: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
3e30: 3d 20 73 74 72 6c 65 6e 28 7a 50 34 29 3b 0a 20  = strlen(zP4);. 
3e40: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
3e50: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
3e60: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
3e70: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3e80: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
3e90: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
3ea0: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
3eb0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
3ec0: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
3ed0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
3ee0: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
3ef0: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
3f00: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
3f10: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
3f20: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
3f30: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
3f40: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
3f50: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
3f60: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
3f70: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
3f80: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
3f90: 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ild..*/.void sql
3fa0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
3fb0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
3fc0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
3fd0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3fe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
3ff0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
4000: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4010: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
4020: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
4030: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
4040: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4050: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
4060: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
4070: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
4080: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
4090: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
40a0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
40b0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
40c0: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  b, *pz);.    *pz
40d0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
40e0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
40f0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
4100: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
4110: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
4120: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
4130: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4140: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
4150: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 71  va_list ap;.  sq
4160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
4170: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61  p, OP_Noop);.  a
4180: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4190: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
41a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
41b0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
41c0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
41d0: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
41e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
41f0: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
4200: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
4210: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4220: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61  zComment;.    va
4230: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
4240: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
4250: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70  DbFree(p->db, *p
4260: 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71  z);.    *pz = sq
4270: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
4280: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
4290: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
42a0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
42b0: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
42d0: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
42e0: 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56  en address..*/.V
42f0: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
4300: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
4310: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73   int addr){.  as
4320: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
4330: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 61 64  );.  assert( (ad
4350: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
4360: 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e  >nOp) || p->db->
4370: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4380: 20 20 72 65 74 75 72 6e 20 28 28 61 64 64 72 3e    return ((addr>
4390: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
43a0: 70 29 3f 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p)?(&p->aOp[addr
43b0: 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64  ]):0);.}..#if !d
43c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
43d0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
43e0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
43f0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
4400: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
4410: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4420: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
4430: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
4440: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
4450: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
4460: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
4470: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
4480: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
4490: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
44a0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
44b0: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
44c0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
44d0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
44e0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
44f0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
4500: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
4510: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
4520: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
4530: 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
4540: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  :.    case P4_KE
4550: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
4560: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
4570: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
4580: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4590: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
45a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
45b0: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  p, zTemp, "keyin
45c0: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
45d0: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
45e0: 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d   i = strlen(zTem
45f0: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
4600: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
4610: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
4620: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
4630: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
4640: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
4650: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
4660: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
4670: 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a   strlen(pColl->z
4680: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
4690: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
46a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
46b0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
46c0: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
46d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
46e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
46f0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4700: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20  = ',';.         
4710: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
4720: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65  SortOrder && pKe
4730: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4740: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
4750: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
4760: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
4770: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
4780: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43  py(&zTemp[i], pC
4790: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b  oll->zName,n+1);
47a0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
47b0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
47c0: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
47d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
47e0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
47f0: 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,nil",4);.      
4800: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
4810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4820: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
4830: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
4840: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
4850: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
4860: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4870: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4880: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
4890: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
48a0: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
48b0: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
48c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
48d0: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
48e0: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
48f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
4900: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4910: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
4920: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
4930: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
4940: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
4950: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4960: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
4970: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
4980: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
4990: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
49b0: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
49c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
49d0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
49e0: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
49f0: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      brea
4a00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4a10: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
4a20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4a30: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4a40: 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
4a50: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
4a60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4a70: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
4a80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4a90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4aa0: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
4ab0: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
4ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4ad0: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
4ae0: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
4af0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
4b00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
4b10: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4b20: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20  M_Null)==0 );.  
4b30: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
4b40: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
4b50: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
4b60: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
4b70: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
4b80: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
4b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4ba0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4bb0: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
4bc0: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
4bd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4be0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
4bf0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
4c00: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4c10: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
4c20: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
4c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
4c50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
4c60: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
4c70: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
4c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
4c90: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
4ca0: 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20 20  >p4.pVtab;.     
4cb0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4cc0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4cd0: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
4ce0: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
4cf0: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
4d00: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4d10: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4d20: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
4d30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4d40: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
4d50: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
4d60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4d70: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4d80: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
4d90: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
4da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
4db0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
4dc0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
4dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4de0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
4df0: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
4e00: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
4e10: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
4e20: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
4e30: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
4e40: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
4e50: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69   used..**.*/.voi
4e60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
4e70: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
4e80: 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61  int i){.  int ma
4e90: 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  sk;.  assert( i>
4ea0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
4eb0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4ec0: 69 3c 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  i<sizeof(p->btre
4ed0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61  eMask)*8 );.  ma
4ee0: 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20 69 66 28  sk = 1<<i;.  if(
4ef0: 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
4f00: 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
4f10: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d   p->btreeMask |=
4f20: 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74   mask;.    sqlit
4f30: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
4f40: 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74  yInsert(&p->aMut
4f50: 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ex, p->db->aDb[i
4f60: 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ].pBt);.  }.}...
4f70: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
4f80: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
4f90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4fa0: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
4fb0: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
4fc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4fd0: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
4fe0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
4ff0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
5000: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
5010: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
5020: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
5030: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
5040: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5050: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
5060: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
5070: 25 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32  %4d %4d %-4s %.2
5080: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
5090: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
50a0: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
50b0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
50c0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
50d0: 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f  ));.  fprintf(pO
50e0: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
50f0: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
5100: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
5110: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
5120: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
5130: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
5140: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
5150: 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d  DEBUG.      pOp-
5160: 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d  >zComment ? pOp-
5170: 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23  >zComment : "".#
5180: 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65  else.      "".#e
5190: 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75  ndif.  );.  fflu
51a0: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
51b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
51c0: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
51d0: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
51e0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
51f0: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
5200: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
5210: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
5220: 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73  Mem *pEnd;.    s
5230: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
5240: 64 62 3b 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c  db;.    int mall
5250: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
5260: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
5270: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
5280: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
5290: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
52a0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
52b0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
52c0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
52d0: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
52e0: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
52f0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
5300: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
5310: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
5320: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
5330: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
5340: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
5350: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
5360: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
5370: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
5380: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
5390: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
53a0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
53b0: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
53c0: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
53d0: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
53e0: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
53f0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
5400: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
5410: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
5420: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
5430: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
5440: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
5450: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
5460: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
5470: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
5480: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
5490: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
54a0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
54b0: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
54c0: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
54d0: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
54e0: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
54f0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
5500: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
5510: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
5520: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
5530: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
5540: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
5550: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
5560: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
5570: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
5580: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
5590: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
55a0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
55b0: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29  MEM_Agg|MEM_Dyn)
55c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
55d0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
55e0: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
55f0: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e if( p->zMalloc
5600: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5610: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
5620: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
5630: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20     p->zMalloc = 
5640: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
5650: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
5660: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
5670: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5680: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
5690: 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  d;.  }.}..#ifdef
56a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
56b0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
56c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
56d0: 52 65 6c 65 61 73 65 42 75 66 66 65 72 73 28 56  ReleaseBuffers(V
56e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
56f0: 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 20 3d  i;.  int nFree =
5700: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
5710: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5720: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
5730: 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
5740: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29  <=p->nMem; ii++)
5750: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
5760: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a  = &p->aMem[ii];.
5770: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20      if( pMem->z 
5780: 26 26 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d  && pMem->flags&M
5790: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
57a0: 61 73 73 65 72 74 28 20 21 70 4d 65 6d 2d 3e 78  assert( !pMem->x
57b0: 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 6e 46 72  Del );.      nFr
57c0: 65 65 20 2b 3d 20 73 71 6c 69 74 65 33 44 62 4d  ee += sqlite3DbM
57d0: 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e  allocSize(pMem->
57e0: 64 62 2c 20 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  db, pMem->z);.  
57f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
5800: 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
5810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5820: 75 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e  urn nFree;.}.#en
5830: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
5840: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
5850: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
5860: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
5870: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
5880: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
5890: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
58a0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
58b0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
58c0: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
58d0: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
58e0: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
58f0: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
5900: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
5910: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5920: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
5930: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
5940: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
5950: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
5960: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
5970: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
5980: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
5990: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
59a0: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
59b0: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
59c0: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
59d0: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
59e0: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
59f0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
5a00: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
5a10: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
5a20: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74  ERY PLAN..*/.int
5a30: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
5a40: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a60: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
5a70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5a80: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
5a90: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5aa0: 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  E_OK;.  Mem *pMe
5ab0: 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  m = p->pResultSe
5ac0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
5ad0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
5ae0: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
5af0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
5b00: 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72  AGIC_RUN ) retur
5b10: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
5b20: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
5b30: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
5b40: 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73  IC_BUSY );.  ass
5b50: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
5b60: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
5b70: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a  SQLITE_BUSY );..
5b80: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
5b90: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
5ba0: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
5bb0: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
5bc0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
5bd0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
5be0: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
5bf0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
5c00: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
5c10: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
5c20: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
5c30: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
5c40: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
5c50: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
5c60: 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  y(pMem, p->nMem)
5c70: 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  ;..  do{.    i =
5c80: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
5c90: 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20  le( i<p->nOp && 
5ca0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
5cb0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
5cc0: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
5cd0: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70  .  if( i>=p->nOp
5ce0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
5cf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
5d00: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
5d10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
5d20: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
5d30: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
5d40: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
5d50: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
5d60: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
5d70: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
5d80: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
5d90: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
5da0: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
5db0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
5dc0: 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  z;.    Op *pOp =
5dd0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
5de0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
5df0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
5e00: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
5e10: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  t;.      pMem->t
5e20: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5e30: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
5e40: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
5e70: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
5e80: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
5e90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
5ea0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
5eb0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
5ec0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
5ed0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
5ee0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
5ef0: 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63  opcode);  /* Opc
5f00: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
5f10: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
5f20: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
5f30: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5f40: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
5f50: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
5f60: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
5f70: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
5f80: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
5f90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
5fa0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
5fb0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
5fc0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
5ff0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
6000: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
6010: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
6020: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
6030: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
6040: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
6070: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
6080: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
6090: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
60a0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
60b0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
60c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
60d0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
60e0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
6110: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  */.      pMem->t
6120: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
6130: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
6140: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
6150: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
6160: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20  mGrow(pMem, 32, 
6170: 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  0) ){           
6180: 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20   /* P4 */.      
6190: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
61a0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
61b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
61c0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  EM;.    }.    pM
61d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
61e0: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
61f0: 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69  Term;.    z = di
6200: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
6210: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
6220: 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b  f( z!=pMem->z ){
6230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6240: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
6250: 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
6260: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
6270: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
6280: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
6290: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
62a0: 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29   strlen(pMem->z)
62b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
62c0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
62d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
62e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
62f0: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  EXT;.    pMem++;
6300: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
6310: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
6320: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
6330: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c  MemGrow(pMem, 4,
6340: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
6350: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6360: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
6370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6380: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
6390: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
63a0: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
63b0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
63c0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
63d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
63e0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
63f0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
6400: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
6410: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
6420: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
6430: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
6440: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
6450: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
6460: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6470: 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  G.      if( pOp-
6480: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
6490: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
64a0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
64b0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
64c0: 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d  m->z = pOp->zCom
64d0: 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  ment;.        pM
64e0: 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  em->n = strlen(p
64f0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
6500: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
6510: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
6520: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
6530: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
6540: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
6550: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
6560: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
6570: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6590: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  Comment */.     
65a0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
65b0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20  SQLITE_NULL;.   
65c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
65d0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
65e0: 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 5*(p->explai
65f0: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  n-1);.    p->rc 
6600: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6610: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
6620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6630: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
6640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
6650: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
6660: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
6670: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
6680: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
6690: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
66a0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
66b0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
66c0: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
66d0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
66e0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
66f0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
6700: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
6710: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
6720: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
6730: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
6740: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63  p4.z!=0 ){.    c
6750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
6760: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68  Op->p4.z;.    wh
6770: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75  ile( isspace(*(u
6780: 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  8*)z) ) z++;.   
6790: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
67a0: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  s]\n", z);.  }.}
67b0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
67c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
67d0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
67e0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
67f0: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
6800: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
6810: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
6820: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
6830: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6840: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
6850: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
6860: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
6870: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
6880: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
6890: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
68a0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
68b0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
68c0: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
68d0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
68e0: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
68f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
6900: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
6910: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
6920: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
6930: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
6940: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
6950: 72 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28  r(i=0; isspace((
6960: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b  unsigned char)z[
6970: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
6980: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
6990: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
69a0: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
69b0: 20 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20   char)z[i]) ){. 
69c0: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
69d0: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
69e0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
69f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6a10: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
6a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6a30: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
6a40: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
6a50: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
6a60: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
6a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
6a80: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
6a90: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a  LE_IOTRACE */...
6aa0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
6ab0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
6ac0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  for execution.  
6ad0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
6ae0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
6af0: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
6b00: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
6b10: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
6b20: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
6b30: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
6b40: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
6b50: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
6b60: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
6b70: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
6b80: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
6b90: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20   .**.** This is 
6ba0: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
6bb0: 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d  move a VDBE from
6bc0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
6bd0: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
6be0: 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  C_RUN..*/.void s
6bf0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
6c00: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
6c30: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c  E */.  int nVar,
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c60: 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68  of '?' see in th
6c70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
6c80: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20  */.  int nMem,  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6cb0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f   memory cells to
6cc0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
6cd0: 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20  nt nCursor,     
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
6d00: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
6d10: 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69  /.  int isExplai
6d20: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
6d30: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
6d40: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
6d50: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ds is present */
6d60: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  .){.  int n;.  s
6d70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
6d80: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
6d90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6da0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6db0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
6dc0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
6dd0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
6de0: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
6df0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6e00: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
6e10: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
6e20: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
6e30: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
6e40: 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73  er. This.   * is
6e50: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
6e60: 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72  l to resizeOpArr
6e70: 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73  ay() below may s
6e80: 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70  hrink the.   * p
6e90: 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f  ->aOp[] array to
6ea0: 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20   save memory if 
6eb0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56  called when in V
6ec0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20  DBE_MAGIC_RUN . 
6ed0: 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f    * state..   */
6ee0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
6ef0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
6f00: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
6f10: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
6f20: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
6f30: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
6f40: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
6f50: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
6f60: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
6f70: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
6f80: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
6f90: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
6fa0: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
6fb0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
6fc0: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
6fd0: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
6fe0: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
6ff0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
7000: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7010: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
7020: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
7030: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
7040: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
7050: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
7060: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
7070: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
7080: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
7090: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
70a0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
70b0: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
70c0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
70d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
70e0: 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72 20  ation space for 
70f0: 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f 0a  registers..  */.
7100: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30    if( p->aMem==0
7110: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67   ){.    int nArg
7120: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  ;       /* Maxim
7130: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
7140: 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73  s passed to a us
7150: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  er function. */.
7160: 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c      resolveP2Val
7170: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
7180: 20 20 20 2f 2a 72 65 73 69 7a 65 4f 70 41 72 72     /*resizeOpArr
7190: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 2a 2f  ay(p, p->nOp);*/
71a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61  .    assert( nVa
71b0: 72 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r>=0 );.    if( 
71c0: 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65  isExplain && nMe
71d0: 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d  m<10 ){.      nM
71e0: 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20  em = 10;.    }. 
71f0: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71 6c     p->aMem = sql
7200: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7210: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 4d 65  (db,.        nMe
7220: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20  m*sizeof(Mem)   
7230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
7240: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Mem */.      + n
7250: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Var*sizeof(Mem) 
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7270: 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b   aVar */.      +
7280: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
7290: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
72a0: 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20  /* apArg */.    
72b0: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
72c0: 63 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20  char*)          
72d0: 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20     /* azVar */. 
72e0: 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73       + nCursor*s
72f0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
7300: 2a 29 2b 31 20 20 2f 2a 20 61 70 43 73 72 20 2a  *)+1  /* apCsr *
7310: 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  /.    );.    if(
7320: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
7330: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
7340: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
7350: 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65     /* aMem[] goe
7360: 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a  s from 1..nMem *
7370: 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  /.      p->nMem 
7380: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 2f  = nMem;        /
7390: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
73a0: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
73b0: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70      p->aVar = &p
73c0: 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b 0a  ->aMem[nMem+1];.
73d0: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
73e0: 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  nVar;.      p->o
73f0: 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  kVar = 0;.      
7400: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a  p->apArg = (Mem*
7410: 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d  *)&p->aVar[nVar]
7420: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
7430: 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61   = (char**)&p->a
7440: 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20  pArg[nArg];.    
7450: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64    p->apCsr = (Vd
7460: 62 65 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61  beCursor**)&p->a
7470: 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  zVar[nVar];.    
7480: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
7490: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f  Cursor;.      fo
74a0: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
74b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
74c0: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
74d0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
74e0: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
74f0: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = db;.      }.  
7500: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
7510: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
7520: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
7530: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
7540: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
7550: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
7560: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
7570: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
7580: 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c  UG.  for(n=1; n<
7590: 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  p->nMem; n++){. 
75a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
75b0: 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a  em[n].db==db );.
75c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d    }.#endif..  p-
75d0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
75e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
75f0: 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20   p->uniqueCnt = 
7600: 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  0;.  p->errorAct
7610: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
7620: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20    p->explain |= 
7630: 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e  isExplain;.  p->
7640: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
7650: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
7660: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
7670: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
7680: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
7690: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
76a0: 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
76b0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
76c0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
76d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
76e0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
76f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i++){.      p->a
7700: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
7710: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
7720: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d  ycles = 0;.    }
7730: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
7740: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
7750: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
7760: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
7770: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
7780: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
7790: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
77a0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
77b0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
77c0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
77d0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
77e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
77f0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
7800: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
7810: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
7820: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
7830: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
7840: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
7850: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
7860: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
7870: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
7880: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
7890: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
78a0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
78b0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
78c0: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
78d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
78e0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
78f0: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
7900: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
7910: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
7920: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
7930: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
7940: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
7950: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
7960: 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64  dule = pCx->pMod
7970: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
7980: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
7990: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
79a0: 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b  afetyOff(p->db);
79b0: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
79c0: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
79d0: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
79e0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e  ite3SafetyOn(p->
79f0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  db);.    p->inVt
7a00: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
7a10: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  }.#endif.  if( !
7a20: 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f  pCx->ephemPseudo
7a30: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
7a40: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
7a50: 2c 20 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20  , pCx->pData);. 
7a60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
7a70: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  e all cursors ex
7a80: 63 65 70 74 20 66 6f 72 20 56 54 61 62 20 63 75  cept for VTab cu
7a90: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 63  rsors that are c
7aa0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75  urrently.** in u
7ab0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
7ac0: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
7ad0: 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74  rsExceptActiveVt
7ae0: 61 62 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  abs(Vdbe *p){.  
7af0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
7b00: 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72  apCsr==0 ) retur
7b10: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
7b20: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
7b30: 7b 0a 20 20 20 20 56 64 62 65 43 75 72 73 6f 72  {.    VdbeCursor
7b40: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
7b50: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26  i];.    if( pC &
7b60: 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74  & (!p->inVtabMet
7b70: 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61  hod || !pC->pVta
7b80: 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  bCursor) ){.    
7b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
7ba0: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
7bb0: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
7bc0: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
7bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
7be0: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
7bf0: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
7c00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
7c10: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
7c20: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
7c30: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
7c40: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
7c50: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
7c60: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
7c70: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
7c80: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
7c90: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
7ca0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
7cb0: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
7cc0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
7cd0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
7ce0: 64 62 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75  db;.  closeAllCu
7cf0: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
7d00: 65 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72  eVtabs(p);.  for
7d10: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
7d20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53  ; i++){.    MemS
7d30: 65 74 54 79 70 65 46 6c 61 67 28 26 70 2d 3e 61  etTypeFlag(&p->a
7d40: 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c  Mem[i], MEM_Null
7d50: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7d60: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
7d70: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  m[1], p->nMem);.
7d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66    sqlite3VdbeFif
7d90: 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f  oClear(&p->sFifo
7da0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74  );.  if( p->cont
7db0: 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  extStack ){.    
7dc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f  for(i=0; i<p->co
7dd0: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69  ntextStackTop; i
7de0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
7df0: 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28  e3VdbeFifoClear(
7e00: 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  &p->contextStack
7e10: 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20  [i].sFifo);.    
7e20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
7e30: 72 65 65 28 64 62 2c 20 70 2d 3e 63 6f 6e 74 65  ree(db, p->conte
7e40: 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20  xtStack);.  }.  
7e50: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20  p->contextStack 
7e60: 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78  = 0;.  p->contex
7e70: 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b  tStackDepth = 0;
7e80: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
7e90: 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c  ckTop = 0;.  sql
7ea0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7eb0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
7ec0: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
7ed0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
7ee0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
7ef0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
7f00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
7f10: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
7f20: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
7f30: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
7f40: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
7f50: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
7f60: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
7f70: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
7f80: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
7f90: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
7fa0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
7fb0: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
7fc0: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
7fd0: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
7fe0: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
7ff0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8000: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
8010: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
8020: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
8030: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
8040: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8050: 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ->db;..  release
8060: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
8070: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
8080: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
8090: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
80a0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
80b0: 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  ;.  n = nResColu
80c0: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
80d0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
80e0: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
80f0: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
8100: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
8110: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8120: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
8130: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
8140: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
8150: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
8160: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
8170: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
8180: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
8190: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
81a0: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
81b0: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
81c0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
81d0: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
81e0: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
81f0: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
8200: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
8210: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
8220: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
8230: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
8240: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
8250: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
8260: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
8270: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8280: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
8290: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
82a0: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
82b0: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
82c0: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
82d0: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
82e0: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
82f0: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
8300: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
8310: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
8320: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
8330: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
8340: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
8350: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
8360: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
8370: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8380: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
83b0: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
83c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
83f0: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
8400: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
8410: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
8440: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
8450: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
8460: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
8470: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8480: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
8490: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
84a0: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
84b0: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
84c0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
84d0: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
84e0: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
84f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
8500: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
8510: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
8520: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
8530: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
8540: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
8550: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8560: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8570: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
8580: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
8590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
85a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
85b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
85c0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
85d0: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
85e0: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
85f0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
8600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
8610: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
8620: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
8630: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
8640: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
8650: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
8660: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
8670: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
8680: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8690: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
86a0: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
86b0: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
86c0: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
86d0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
86e0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
86f0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
8700: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
8710: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
8720: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
8730: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
8740: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
8750: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
8760: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
8770: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
8780: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
8790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
87a0: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
87b0: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
87c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
87d0: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
87e0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
87f0: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
8800: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
8810: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
8820: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8830: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
8840: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f   = 0;..  /* Befo
8850: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
8860: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
8870: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
8880: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
8890: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
88a0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
88b0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
88c0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
88d0: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
88e0: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
88f0: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
8900: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
8910: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
8920: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
8930: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
8940: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
8950: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
8960: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
8970: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
8980: 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e  tabSync(db, &p->
8990: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
89a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
89b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
89c0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
89d0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
89e0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
89f0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
8a00: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
8a10: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
8a20: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
8a30: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
8a40: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
8a50: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
8a60: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
8a70: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
8a80: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
8a90: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
8aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
8ab0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
8ac0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
8ad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
8ae0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
8af0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
8b00: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
8b10: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
8b20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8b30: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8b40: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8b50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
8b60: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
8b70: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
8b80: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
8b90: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
8ba0: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
8bb0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
8bc0: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
8bd0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
8be0: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
8bf0: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
8c00: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
8c10: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
8c20: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76  llback ){.    (v
8c30: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
8c40: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
8c50: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
8c60: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
8c70: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
8c80: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
8c90: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
8ca0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
8cb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
8cc0: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
8cd0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
8ce0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
8cf0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
8d00: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
8d10: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
8d20: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
8d30: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
8d40: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
8d50: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
8d60: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
8d70: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
8d80: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
8d90: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
8da0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
8db0: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
8dc0: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
8dd0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
8de0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
8df0: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
8e00: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
8e10: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
8e20: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
8e30: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
8e40: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
8e50: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
8e60: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
8e70: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c  */.  if( 0==strl
8e80: 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  en(sqlite3BtreeG
8e90: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
8ea0: 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e  Db[0].pBt)) || n
8eb0: 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20  Trans<=1 ){.    
8ec0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
8ed0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
8ee0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
8ef0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8f00: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
8f10: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
8f20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8f30: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
8f40: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
8f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8f60: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
8f70: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
8f80: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
8f90: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
8fa0: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
8fb0: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
8fc0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8fd0: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
8fe0: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
8ff0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
9000: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
9010: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
9020: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
9030: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
9040: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
9050: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
9060: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
9070: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
9080: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
9090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
90a0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
90b0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
90c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
90d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
90e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
90f0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
9100: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
9110: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
9120: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
9130: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
9160: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
9170: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
9180: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
9190: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
91a0: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
91b0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
91c0: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
91d0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
91e0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
91f0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
9200: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
9210: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
9220: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
9230: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
9240: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
9250: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
9260: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
9270: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
9280: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
9290: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
92a0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
92b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
92c0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
92d0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
92e0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
92f0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
9300: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
9310: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
9320: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
9330: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
9340: 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  es;..    /* Sele
9350: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
9360: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
9370: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
9380: 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20  u32 random;.    
9390: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
93a0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
93b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
93c0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61  omness(sizeof(ra
93d0: 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b  ndom), &random);
93e0: 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  .      zMaster =
93f0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9400: 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c  db, "%s-mj%08X",
9410: 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64   zMainFile, rand
9420: 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a  om&0x7fffffff);.
9430: 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
9440: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  er ){.        re
9450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9460: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
9470: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
9480: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
9490: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
94a0: 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
94b0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
94c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
94d0: 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
94e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
94f0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
9500: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
9510: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
9520: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
9530: 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
9540: 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
9550: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
9560: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
9570: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
9580: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
9590: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
95a0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
95b0: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
95c0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
95d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
95e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
95f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9600: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
9610: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9620: 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
9630: 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
9640: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
9650: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9660: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
9670: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
9680: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
9690: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
96a0: 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
96b0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
96c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
96d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
96e0: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
96f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
9700: 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
9710: 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
9720: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
9730: 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
9740: 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
9750: 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
9760: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
9770: 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
9780: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
9790: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
97a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
97b0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
97c0: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
97d0: 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67  ontinue;   /* Ig
97e0: 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  nore the TEMP da
97f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
9800: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
9810: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
9820: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
9830: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
9840: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
9850: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
9860: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
9870: 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [0]==0 ) continu
9880: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d  e;  /* Ignore :m
9890: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
98a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
98b0: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
98c0: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
98d0: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
98e0: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
98f0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
9900: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9910: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
9920: 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72  ster, zFile, str
9930: 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  len(zFile)+1, of
9940: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
9950: 66 66 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28  ffset += strlen(
9960: 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
9970: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9980: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
9990: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
99a0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
99b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
99c0: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
99d0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
99e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
99f0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
9a00: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
9a10: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
9a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9a30: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
9a40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9a50: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
9a60: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
9a70: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
9a80: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
9a90: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
9aa0: 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65  */.    zMainFile
9ab0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
9ac0: 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44  etDirname(db->aD
9ad0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[0].pBt);.    i
9ae0: 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20  f( (needSync .  
9af0: 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74     && (0==(sqlit
9b00: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
9b10: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
9b20: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
9b30: 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20  SEQUENTIAL)).   
9b40: 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33    && (rc=sqlite3
9b50: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
9b60: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
9b70: 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  AL))!=SQLITE_OK)
9b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9b90: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
9ba0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
9bb0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
9bc0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
9bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9be0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
9bf0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9c00: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9c10: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
9c20: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
9c30: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
9c40: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
9c50: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
9c60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c70: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
9c80: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
9c90: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
9ca0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
9cb0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
9cc0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
9cd0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
9ce0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
9cf0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
9d00: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
9d10: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9d20: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9d30: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
9d40: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
9d50: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
9d60: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
9d70: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
9d80: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
9d90: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
9da0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
9db0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9dc0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
9dd0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
9de0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
9df0: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
9e00: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  e failure occure
9e10: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9e20: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
9e30: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
9e40: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
9e50: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
9e60: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9e70: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
9e80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9e90: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9ea0: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
9eb0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
9ec0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
9ed0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
9ee0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
9ef0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9f00: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9f10: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
9f20: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9f30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
9f40: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
9f50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
9f60: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
9f70: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
9f80: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
9f90: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
9fa0: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
9fb0: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
9fc0: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
9fd0: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
9fe0: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
9ff0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
a000: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
a010: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
a020: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a030: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
a040: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
a050: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
a060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
a070: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
a080: 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
a090: 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
a0a0: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
a0b0: 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
a0c0: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
a0d0: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
a0e0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
a0f0: 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
a100: 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
a110: 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
a120: 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
a130: 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
a140: 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
a150: 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
a160: 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
a170: 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
a180: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
a190: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
a1a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
a1b0: 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
a1c0: 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
a1d0: 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
a1e0: 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
a1f0: 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
a200: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
a210: 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
a220: 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
a230: 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
a240: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
a250: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
a260: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
a270: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a280: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
a290: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
a2a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a2b0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
a2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a2d0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
a2e0: 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20  aseTwo(pBt);.   
a2f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
a300: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
a310: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
a320: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
a330: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
a340: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
a350: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
a360: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
a370: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
a380: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
a390: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  at the sqlite3.a
a3a0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75  ctiveVdbeCnt cou
a3b0: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
a3c0: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
a3d0: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
a3e0: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
a3f0: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
a400: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
a410: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
a420: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
a430: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
a440: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
a450: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
a460: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
a470: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
a480: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
a490: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
a4a0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
a4b0: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
a4c0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
a4d0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
a4e0: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
a4f0: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
a500: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
a510: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
a520: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
a530: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
a540: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
a550: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
a560: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
a570: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
a580: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
a590: 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
a5a0: 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
a5b0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
a5c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
a5d0: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
a5e0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
a5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
a600: 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64  ite==db->writeVd
a610: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65  beCnt );.}.#else
a620: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
a630: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
a640: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
a650: 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61   every Btree tha
a660: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  t in database co
a670: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63  nnection db whic
a680: 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  h .** has been m
a690: 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20  odified, "trip" 
a6a0: 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61  or invalidate ea
a6b0: 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20  ch cursor in.** 
a6c0: 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74  that Btree might
a6d0: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
a6e0: 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
a6f0: 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65  cursor.** can ne
a700: 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69  ver be used agai
a710: 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  n.  This happens
a720: 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
a730: 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65  .*** occurs.  We
a740: 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c   have to trip al
a750: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73  l the other curs
a760: 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72  ors, even.** cur
a770: 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56  sor from other V
a780: 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  Ms in different 
a790: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
a7a0: 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74  ions,.** so that
a7b0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72   none of them tr
a7c0: 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74  y to use the dat
a7d0: 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a  a at which they.
a7e0: 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67  ** were pointing
a7f0: 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d   and which now m
a800: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61  ay have been cha
a810: 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74  nged due.** to t
a820: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
a830: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74  ** Remember that
a840: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20   a rollback can 
a850: 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f  delete tables co
a860: 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65  mplete and.** re
a870: 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e  order rootpages.
a880: 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73    So it is not s
a890: 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74  ufficient just t
a8a0: 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74  o save.** the st
a8b0: 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
a8c0: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  r.  We have to i
a8d0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75  nvalidate the cu
a8e0: 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20  rsor.** so that 
a8f0: 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  it is never used
a900: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   again..*/.stati
a910: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
a920: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
a930: 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33  edBtrees(sqlite3
a940: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
a950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
a960: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
a970: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
a980: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
a990: 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42  f( p && sqlite3B
a9a0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
a9b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a9c0: 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
a9d0: 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41  sors(p, SQLITE_A
a9e0: 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  BORT);.    }.  }
a9f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
aa00: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
aa10: 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
aa20: 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
aa30: 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
aa40: 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
aa50: 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
aa60: 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
aa70: 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
aa80: 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
aa90: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
aaa0: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
aab0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
aac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
aad0: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
aae0: 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
aaf0: 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
ab00: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
ab10: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
ab20: 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72  HALT.  It is har
ab30: 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c  mless to.** call
ab40: 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68   this on a VM th
ab50: 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c  at is in the SQL
ab60: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73  ITE_MAGIC_HALT s
ab70: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tate..**.** Retu
ab80: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
ab90: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
aba0: 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
abb0: 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
abc0: 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
abd0: 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
abe0: 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
abf0: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
ac00: 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
ac10: 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
ac20: 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
ac30: 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
ac40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ac50: 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
ac60: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
ac70: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
ac80: 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e   i;.  int (*xFun
ac90: 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d  c)(Btree *pBt) =
aca0: 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e   0;  /* Function
acb0: 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68   to call on each
acc0: 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a   btree backend *
acd0: 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69 61  /.  int isSpecia
ace0: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
acf0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
ad00: 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e if SQLITE_NOME
ad10: 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20  M or IOERR */.. 
ad20: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
ad30: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
ad40: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
ad50: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
ad60: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
ad70: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
ad80: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
ad90: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
ada0: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
adb0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
adc0: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
add0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
ade0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
adf0: 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
ae00: 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
ae10: 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
ae20: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
ae30: 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
ae40: 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
ae50: 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
ae60: 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
ae70: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
ae80: 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
ae90: 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
aea0: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
aeb0: 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
aec0: 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
aed0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
aee0: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
aef0: 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
af00: 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
af10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
af20: 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
af30: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
af40: 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
af50: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
af60: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
af70: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
af80: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
af90: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
afa0: 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69 66 28  eVtabs(p);.  if(
afb0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
afc0: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
afd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
afe0: 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63  K;.  }.  checkAc
aff0: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
b000: 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
b010: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
b020: 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
b030: 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
b040: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
b050: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  =0 ){.    int mr
b060: 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
b070: 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
b080: 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a  p->rc */..    /*
b090: 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
b0a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
b0b0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
b0c0: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
b0d0: 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d  rrayEnter(&p->aM
b0e0: 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  utex);..    /* C
b0f0: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
b100: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
b110: 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
b120: 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
b130: 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
b140: 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
b150: 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
b160: 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b180: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
b190: 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
b1a0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
b1b0: 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
b1c0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
b1d0: 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
b1e0: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e   read-only, we n
b1f0: 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61  eed do no rollba
b200: 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72  ck at all. Other
b210: 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70  wise,.      ** p
b220: 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65 20  roceed with the 
b230: 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
b240: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b250: 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
b260: 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
b270: 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
b280: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
b290: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
b2a0: 4f 43 4b 45 44 20 26 26 20 70 2d 3e 75 73 65 73  OCKED && p->uses
b2b0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
b2c0: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
b2d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
b2e0: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
b2f0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
b300: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
b310: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6d 72 63    }else if( (mrc
b320: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
b330: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
b340: 4c 4c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL).            
b350: 20 20 20 20 20 20 20 26 26 20 70 2d 3e 75 73 65         && p->use
b360: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
b370: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
b380: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
b390: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
b3a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b3b0: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
b3c0: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
b3d0: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
b3e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
b3f0: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
b400: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
b410: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
b420: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
b430: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
b440: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
b450: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76  */.          inv
b460: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b470: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
b480: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
b490: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
b4a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
b4b0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
b4c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
b4d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
b4e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
b4f0: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
b500: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
b510: 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
b520: 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20   vdbe, then.    
b530: 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  ** we do either 
b540: 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
b550: 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
b560: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
b570: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
b580: 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
b590: 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
b5a0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
b5b0: 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
b5c0: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
b5d0: 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
b5e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
b5f0: 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62  autoCommit && db
b600: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d  ->writeVdbeCnt==
b610: 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
b620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
b630: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
b640: 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
b650: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
b660: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
b670: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b680: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
b690: 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74  g is true, and t
b6a0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
b6b0: 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  was .        ** 
b6c0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69  successful or hi
b6d0: 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
b6e0: 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20  onstraint. This 
b6f0: 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
b700: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
b710: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20  quired..        
b720: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
b730: 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
b740: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69  b, p);.        i
b750: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
b760: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
b770: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
b780: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
b790: 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
b7a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b7b0: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
b7c0: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
b7d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b7e0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b7f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b800: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b810: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b820: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b830: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
b840: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
b850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b860: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b870: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b880: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
b890: 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63  }else if( !xFunc
b8a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
b8b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
b8c0: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
b8d0: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
b8e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
b8f0: 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  edStatement ){. 
b900: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
b910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
b920: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  mitStmt;.       
b930: 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   } .      }else 
b940: 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
b950: 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
b960: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
b970: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b980: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
b990: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
b9a0: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
b9b0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b9c0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
b9d0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
b9e0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
b9f0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
ba00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ba10: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
ba20: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
ba30: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
ba40: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
ba50: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
ba60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
ba70: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
ba80: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
ba90: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
baa0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
bab0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
bac0: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
bad0: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
bae0: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
baf0: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
bb00: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
bb10: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
bb20: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
bb30: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
bb40: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
bb50: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
bb60: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
bb70: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
bb80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
bb90: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
bba0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
bbb0: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
bbc0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
bbd0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
bbe0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
bbf0: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
bc00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
bc10: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
bc20: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
bc30: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
bc40: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
bc50: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
bc60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
bc70: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
bc80: 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
bc90: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
bca0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bcb0: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
bcc0: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
bcd0: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
bce0: 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68  or DELETE and th
bcf0: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
bd00: 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20  committed, .    
bd10: 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e 67  ** set the chang
bd20: 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e counter. .    
bd30: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
bd40: 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e  angeCntOn && p->
bd50: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  pc>=0 ){.      i
bd60: 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75  f( !xFunc || xFu
bd70: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
bd80: 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20  CommitStmt ){.  
bd90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bda0: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
bdb0: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
bdc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bdd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
bde0: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
bdf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
be00: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
be10: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
be20: 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
be30: 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
be40: 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
be50: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
be60: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
be70: 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
be80: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
be90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bea0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
beb0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
bec0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
bed0: 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
bee0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
bef0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
bf00: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
bf10: 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
bf20: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
bf30: 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
bf40: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
bf50: 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
bf60: 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
bf70: 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
bf80: 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
bf90: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
bfa0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
bfb0: 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  veVdbeCnt--;.   
bfc0: 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
bfd0: 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77  y ){.      db->w
bfe0: 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  riteVdbeCnt--;. 
bff0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
c000: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
c010: 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  nt>=db->writeVdb
c020: 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt );.  }.  p-
c030: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
c040: 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
c050: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
c060: 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
c070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c080: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c090: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
c0a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c0b0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  OK;.}.../*.** Ea
c0c0: 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
c0d0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
c0e0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
c0f0: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
c100: 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
c110: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
c120: 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
c130: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
c140: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c150: 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
c160: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
c170: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
c180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
c190: 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
c1a0: 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
c1b0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
c1c0: 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
c1d0: 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
c1e0: 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
c1f0: 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
c200: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
c210: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
c220: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c230: 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
c240: 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
c250: 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
c260: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
c270: 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
c280: 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
c290: 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
c2a0: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
c2b0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
c2c0: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
c2d0: 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
c2e0: 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
c2f0: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
c300: 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
c310: 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
c320: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
c330: 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
c340: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
c350: 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
c360: 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
c370: 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
c380: 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
c390: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
c3a0: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
c3b0: 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
c3c0: 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
c3d0: 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  w..  */.  (void)
c3e0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
c3f0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  db);.  sqlite3Vd
c400: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f  beHalt(p);.  (vo
c410: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
c420: 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  Off(db);..  /* I
c430: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
c440: 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
c450: 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
c460: 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
c470: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
c480: 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
c490: 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
c4a0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
c4b0: 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
c4c0: 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
c4d0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
c4e0: 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
c4f0: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
c500: 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
c510: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
c520: 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
c530: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
c540: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
c550: 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
c560: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
c570: 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
c580: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c590: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
c5a0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
c5b0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
c5c0: 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45  b->pErr,-1,p->zE
c5d0: 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46  rrMsg,SQLITE_UTF
c5e0: 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  8,SQLITE_TRANSIE
c5f0: 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NT);.      sqlit
c600: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
c610: 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  c();.      db->e
c620: 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
c630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c640: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
c650: 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
c660: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
c670: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
c680: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c690: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
c6a0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
c6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
c6c0: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
c6d0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
c6e0: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
c6f0: 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
c700: 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
c710: 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
c720: 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
c730: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
c740: 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
c750: 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
c760: 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
c770: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
c780: 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
c790: 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
c7a0: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
c7b0: 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
c7c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
c7d0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
c7e0: 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
c7f0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
c800: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
c810: 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
c820: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
c830: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
c840: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c850: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
c860: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
c870: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
c880: 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
c890: 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
c8a0: 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
c8b0: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
c8c0: 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
c8d0: 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
c8e0: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
c8f0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
c900: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
c910: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
c920: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
c930: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
c940: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
c950: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
c960: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
c970: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c980: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
c990: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
c9a0: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
c9b0: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
c9c0: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
c9d0: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
c9e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
c9f0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
ca00: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
ca10: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
ca20: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
ca30: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
ca40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
ca50: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
ca60: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
ca70: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
ca80: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
ca90: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
caa0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
cab0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
cac0: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
cad0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
cae0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
caf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
cb00: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
cb10: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
cb20: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
cb30: 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
cb40: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
cb50: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
cb60: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
cb70: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
cb80: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
cb90: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
cba0: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
cbb0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
cbc0: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
cbd0: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
cbe0: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
cbf0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
cc00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
cc10: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
cc20: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
cc30: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
cc40: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
cc50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
cc60: 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
cc70: 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
cc80: 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
cc90: 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c );.  }else if(
cca0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
ccb0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
ccc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ccd0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
cce0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
ccf0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
cd00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
cd10: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
cd20: 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
cd30: 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
cd40: 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
cd50: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
cd60: 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
cd70: 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
cd80: 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
cd90: 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
cda0: 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
cdb0: 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
cdc0: 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
cdd0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
cde0: 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
cdf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ce00: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
ce10: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
ce20: 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
ce30: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
ce40: 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
ce50: 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
ce60: 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
ce70: 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
ce80: 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
ce90: 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
cea0: 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26  (mask&(1<<i))) &
ceb0: 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
cec0: 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
ced0: 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
cee0: 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
cef0: 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
cf00: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
cf10: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
cf20: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
cf30: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
cf40: 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
cf50: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
cf60: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
cf70: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
cf80: 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ;..  if( p==0 ) 
cf90: 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
cfa0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ->db;.  if( p->p
cfb0: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
cfc0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
cfd0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
cfe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
cff0: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
d000: 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
d010: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
d020: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
d030: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
d040: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
d050: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
d060: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70  .    Op *pOp = p
d070: 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  ->aOp;.    for(i
d080: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
d090: 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
d0a0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
d0b0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
d0c0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
d0d0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73  TE_DEBUG.      s
d0e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d0f0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
d100: 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20  .#endif     .   
d110: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
d120: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4f 70 29  Free(db, p->aOp)
d130: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
d140: 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
d150: 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c   p->nVar);.  sql
d160: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d170: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 69 66 28  ->aLabel);.  if(
d180: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
d190: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d1a0: 2c 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a  , &p->aMem[1]);.
d1b0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
d1c0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
d1d0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
d1e0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
d1f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d200: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
d210: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d220: 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70  b, p->zSql);.  p
d230: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
d240: 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c  AGIC_DEAD;.  sql
d250: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d260: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  );.}../*.** If a
d270: 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
d280: 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
d290: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
d2a0: 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
d2b0: 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52  * MoveTo now.  R
d2c0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
d2d0: 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65  ode.  If no Move
d2e0: 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74  To is pending, t
d2f0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
d300: 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20  oes nothing and 
d310: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
d320: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
d330: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
d340: 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
d350: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
d360: 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
d370: 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
d380: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
d390: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
d3a0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
d3b0: 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ount;.#endif.   
d3c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61   assert( p->isTa
d3d0: 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ble );.    rc = 
d3e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
d3f0: 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43  toUnpacked(p->pC
d400: 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
d410: 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
d420: 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  es);.    if( rc 
d430: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d440: 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20   p->lastRowid = 
d450: 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65  keyToInt(p->move
d460: 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70  toTarget);.    p
d470: 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
d480: 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28   res==0;.    if(
d490: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
d4a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d4b0: 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72  eNext(p->pCursor
d4c0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69  , &res);.      i
d4d0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d4e0: 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  c;.    }.#ifdef 
d4f0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
d500: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
d510: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
d520: 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
d530: 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
d540: 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
d550: 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65  ACHE_STALE;.  }e
d560: 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73  lse if( p->pCurs
d570: 6f 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  or ){.    int ha
d580: 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
d590: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d5a0: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
d5b0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
d5c0: 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
d5d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d5e0: 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
d5f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
d600: 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
d610: 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
d620: 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
d630: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d640: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d650: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d660: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
d670: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d680: 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
d690: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d6a0: 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
d6b0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
d6c0: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
d6d0: 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
d6e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d6f0: 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
d700: 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
d710: 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
d720: 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
d730: 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
d740: 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
d750: 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
d760: 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
d770: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
d780: 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
d790: 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
d7a0: 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
d7b0: 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
d7c0: 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
d7d0: 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
d7e0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
d7f0: 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
d800: 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
d810: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
d820: 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
d830: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
d840: 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
d850: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
d860: 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
d870: 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
d880: 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
d890: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
d8a0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
d8b0: 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
d8c0: 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
d8d0: 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
d8e0: 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
d8f0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
d900: 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
d910: 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
d920: 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
d930: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
d940: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
d950: 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
d960: 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
d970: 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
d980: 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
d990: 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
d9a0: 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
d9b0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
d9c0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
d9d0: 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
d9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
d9f0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
da00: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
da10: 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
da20: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
da30: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
da40: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
da50: 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
da80: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
da90: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
dab0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
dac0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
dad0: 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
dae0: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
daf0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
db00: 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
db30: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
db40: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
db50: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
db60: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
db70: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
dba0: 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
dbb0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
dbc0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
dbd0: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
dbe0: 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
dbf0: 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
dc00: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
dc10: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
dc20: 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
dc30: 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
dc60: 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
dc70: 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
dc80: 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
dc90: 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
dca0: 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
dcb0: 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
dcc0: 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
dcd0: 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
dce0: 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
dcf0: 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
dd00: 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
dd10: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
dd20: 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
dd30: 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
dd40: 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
dd50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dd60: 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
dd70: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
dd80: 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
dd90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
dda0: 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
ddb0: 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
ddc0: 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
ddd0: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
dde0: 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
ddf0: 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
de00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
de10: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
de20: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
de30: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
de40: 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
de50: 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
de60: 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
de70: 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
de80: 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
de90: 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
dea0: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
deb0: 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
dec0: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26  file_format>=4 &
ded0: 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20  & (i&1)==i ){.  
dee0: 20 20 20 20 72 65 74 75 72 6e 20 38 2b 69 3b 0a      return 8+i;.
def0: 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c      }.    u = i<
df00: 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20  0 ? -i : i;.    
df10: 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
df20: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
df30: 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
df40: 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
df50: 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
df60: 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
df70: 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
df80: 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
df90: 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
dfa0: 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
dfb0: 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
dfc0: 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
dfd0: 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
dfe0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
dff0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e000: 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
e010: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
e020: 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
e030: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
e040: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
e050: 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20   += pMem->u.i;. 
e060: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
e070: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
e080: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
e090: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
e0a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
e0b0: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
e0c0: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
e0d0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
e0e0: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
e0f0: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
e100: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e110: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
e120: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
e130: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
e140: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
e150: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
e160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
e170: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
e180: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
e190: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
e1a0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
e1b0: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
e1c0: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
e1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
e1e0: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
e1f0: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
e200: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
e210: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
e220: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
e230: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
e240: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
e250: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
e260: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
e270: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
e280: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
e290: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
e2a0: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
e2b0: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
e2c0: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
e2d0: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
e2e0: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
e2f0: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
e300: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
e310: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
e320: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
e330: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
e340: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
e350: 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
e360: 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
e370: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
e380: 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
e390: 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
e3a0: 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
e3b0: 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
e3c0: 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
e3d0: 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
e3e0: 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
e3f0: 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
e400: 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
e410: 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
e420: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
e430: 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
e440: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
e450: 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
e460: 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
e470: 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
e480: 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
e490: 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
e4a0: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
e4b0: 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
e4c0: 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
e4d0: 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
e4e0: 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
e4f0: 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
e500: 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
e510: 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
e520: 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
e530: 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
e540: 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
e550: 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
e560: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
e570: 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
e580: 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
e590: 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
e5a0: 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
e5b0: 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
e5c0: 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
e5d0: 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
e5e0: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
e5f0: 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
e600: 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
e610: 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
e620: 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
e630: 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
e640: 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
e650: 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
e660: 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
e670: 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
e680: 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
e690: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
e6a0: 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
e6b0: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
e6c0: 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
e6d0: 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
e6e0: 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
e6f0: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
e700: 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
e710: 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
e720: 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
e730: 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
e740: 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
e750: 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
e760: 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
e770: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
e780: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
e790: 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
e7a0: 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
e7b0: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
e7c0: 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
e7d0: 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
e7e0: 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
e7f0: 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
e800: 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
e810: 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
e820: 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
e830: 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
e840: 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
e850: 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
e860: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
e870: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
e880: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
e890: 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
e8a0: 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
e8b0: 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
e8c0: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
e8d0: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
e8e0: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
e8f0: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
e900: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
e910: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
e920: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
e930: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
e940: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
e950: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
e960: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
e970: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
e980: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
e990: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
e9a0: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
e9b0: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
e9c0: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
e9d0: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
e9e0: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
e9f0: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
ea00: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
ea10: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
ea20: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
ea30: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
ea40: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
ea50: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
ea60: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
ea70: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
ea80: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
ea90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
eaa0: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
eab0: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
eac0: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
ead0: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
eae0: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
eaf0: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
eb00: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
eb10: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
eb20: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
eb30: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
eb40: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
eb50: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
eb60: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
eb70: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
eb80: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
eb90: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
eba0: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
ebb0: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
ebc0: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
ebd0: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
ebe0: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
ebf0: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
ec00: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
ec10: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
ec20: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
ec30: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
ec40: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
ec50: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
ec60: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
ec70: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
ec80: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
ec90: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
eca0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
ecb0: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
ecc0: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
ecd0: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
ece0: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
ecf0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
ed00: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
ed10: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
ed20: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
ed30: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
ed40: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
ed50: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
ed60: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
ed70: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
ed80: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
ed90: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
eda0: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
edb0: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
edc0: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
edd0: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
ede0: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
edf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
ee00: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
ee10: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
ee20: 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
ee30: 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
ee40: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
ee50: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
ee60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ee70: 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
ee80: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
ee90: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
eea0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
eeb0: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
eec0: 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75  assert( len<=nBu
eed0: 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
eee0: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
eef0: 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a  [i] = (v&0xFF);.
ef00: 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
ef10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
ef20: 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
ef30: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
ef40: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
ef50: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
ef60: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
ef70: 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
ef80: 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
ef90: 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20  u.i:0).         
efa0: 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64      == sqlite3Vd
efb0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
efc0: 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
efd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
efe0: 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
eff0: 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
f000: 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
f010: 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
f020: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
f030: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
f040: 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
f050: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69  em->u.i;.      i
f060: 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20  f( len>nBuf ){. 
f070: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75         len = nBu
f080: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
f090: 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
f0a0: 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
f0b0: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
f0c0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
f0d0: 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
f0e0: 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
f0f0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
f100: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
f110: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
f120: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
f130: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
f140: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
f150: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
f160: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
f170: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
f180: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
f190: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
f1a0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
f1b0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
f1c0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
f1d0: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
f1e0: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
f1f0: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
f200: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
f210: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
f220: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
f230: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
f260: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
f270: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
f280: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
f290: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
f2a0: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
f2b0: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
f2c0: 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
f2d0: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
f2e0: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
f2f0: 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
f300: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
f310: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f320: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
f330: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f340: 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
f350: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f360: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
f370: 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
f380: 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
f390: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f3a0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
f3b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
f3c0: 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
f3d0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
f3e0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
f3f0: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
f400: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
f410: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
f420: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f430: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
f440: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
f450: 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
f460: 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
f470: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
f480: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
f490: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
f4a0: 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
f4b0: 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
f4c0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
f4d0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
f4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
f4f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
f500: 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
f510: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
f520: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
f530: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
f540: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
f550: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
f560: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
f570: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
f580: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
f590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f5a0: 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
f5b0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
f5c0: 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
f5d0: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
f5e0: 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
f5f0: 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
f600: 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
f610: 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
f620: 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
f630: 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
f640: 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
f650: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
f660: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
f670: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f680: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
f690: 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
f6a0: 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
f6b0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
f6c0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
f6d0: 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
f6e0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
f6f0: 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
f700: 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
f710: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
f720: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f730: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
f740: 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
f750: 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
f760: 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
f770: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
f780: 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
f790: 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
f7a0: 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
f7b0: 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
f7c0: 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
f7d0: 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
f7e0: 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
f7f0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
f800: 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
f810: 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
f820: 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
f830: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
f840: 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
f850: 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
f860: 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
f870: 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
f880: 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
f890: 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
f8a0: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
f8b0: 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
f8c0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
f8d0: 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
f8e0: 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
f8f0: 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
f900: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
f910: 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
f920: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
f930: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
f940: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
f950: 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
f960: 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
f970: 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
f980: 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
f990: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
f9a0: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
f9b0: 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
f9c0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
f9d0: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
f9e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f9f0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
fa00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
fa10: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
fa20: 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
fa30: 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
fa40: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
fa50: 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
fa60: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
fa70: 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
fa80: 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
fa90: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
faa0: 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72  te3IsNaN(pMem->r
fab0: 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
fac0: 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
fad0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
fae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
faf0: 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
fb00: 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
fb10: 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
fb20: 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
fb30: 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
fb40: 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
fb50: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
fb60: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
fb70: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
fb80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
fb90: 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
fba0: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
fbb0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
fbc0: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
fbd0: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
fbe0: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
fbf0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
fc00: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
fc10: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
fc20: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
fc30: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
fc40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
fc60: 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
fc70: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
fc80: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
fc90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
fca0: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
fcb0: 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
fcc0: 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
fcd0: 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
fce0: 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a  [], parse the.**
fcf0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55   record into a U
fd00: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
fd10: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
fd20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
fd30: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e   that structure.
fd40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
fd50: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68  ng function migh
fd60: 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63  t provide szSpac
fd70: 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  e bytes of memor
fd80: 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53  y.** space at pS
fd90: 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63  pace.  This spac
fda0: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
fdb0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
fdc0: 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64  ed.** VDbeParsed
fdd0: 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
fde0: 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   if it is large 
fdf0: 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69  enough.  If it i
fe00: 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f  s.** not big eno
fe10: 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62  ugh, space is ob
fe20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
fe30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
fe40: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
fe50: 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c   structure shoul
fe60: 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61  d be closed by a
fe70: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
fe80: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
fe90: 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a  ackedRecord()..*
fea0: 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  / .UnpackedRecor
feb0: 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65  d *sqlite3VdbeRe
fec0: 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
fed0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
fee0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
fef0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
ff00: 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
ff10: 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
ff20: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
ff30: 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
ff40: 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
ff50: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
ff60: 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
ff70: 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
ff80: 6b 65 64 52 65 63 6f 72 64 20 2a 70 53 70 61 63  kedRecord *pSpac
ff90: 65 2c 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c  e,/* Space avail
ffa0: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65 73  able to hold res
ffb0: 75 6c 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f  ulting object */
ffc0: 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20  .  int szSpace  
ffd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ffe0: 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e  e of pSpace[] in
fff0: 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   bytes */.){.  c
10000 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10010 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
10020 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10030 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b  *)pKey;.  Unpack
10040 65 64 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69  edRecord *p;.  i
10050 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
10060 69 64 78 2c 20 64 3b 0a 20 20 75 31 36 20 75 3b  idx, d;.  u16 u;
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
10090 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
100a0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
100b0 2a 70 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65  *pMem;.  .  asse
100c0 72 74 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e  rt( sizeof(Mem)>
100d0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
100e0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d  nByte = sizeof(M
100f0 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
10100 46 69 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20  Field+2);.  if( 
10110 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
10120 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
10130 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
10140 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
10150 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
10160 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
10170 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
10180 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55  ED_NEED_FREE | U
10190 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
101a0 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROY;.  }else{. 
101b0 20 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20     p = pSpace;. 
101c0 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
101d0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
101e0 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  ROY;.  }.  p->pK
101f0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
10200 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
10210 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
10220 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d  d + 1;.  p->aMem
10230 20 3d 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d   = pMem = &((Mem
10240 2a 29 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d  *)p)[1];.  idx =
10250 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
10260 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
10270 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
10280 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
10290 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65  Hdr && u<p->nFie
102a0 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
102b0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
102c0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
102d0 33 32 28 20 61 4b 65 79 2b 69 64 78 2c 20 73 65  32( aKey+idx, se
102e0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
102f0 69 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73  if( d>=nKey && s
10300 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10310 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
10320 79 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  ype)>0 ) break;.
10330 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
10340 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
10350 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
10360 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
10370 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
10380 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
10390 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
103a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
103b0 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
103c0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
103d0 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
103e0 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
103f0 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
10400 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
10410 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
10420 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  u;.  return (voi
10430 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  d*)p;.}../*.** T
10440 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74  his routine dest
10450 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52  roys a UnpackedR
10460 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a  ecord object.*/.
10470 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10480 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
10490 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63  cord(UnpackedRec
104a0 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
104b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66   ){.    if( p->f
104c0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
104d0 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a  NEED_DESTROY ){.
104e0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
104f0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20     Mem *pMem;.  
10500 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65      for(i=0, pMe
10510 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e  m=p->aMem; i<p->
10520 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65  nField; i++, pMe
10530 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
10540 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  ( pMem->zMalloc 
10550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10560 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
10570 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  se(pMem);.      
10580 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10590 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61  }.    if( p->fla
105a0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
105b0 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 20  ED_FREE ){.     
105c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
105d0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
105e0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
105f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10600 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
10610 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
10620 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
10630 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
10640 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  y {nKey1, pKey1}
10650 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74   and pPKey2.  It
10660 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
10670 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
10680 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
10690 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73   if key1 is less
106a0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
106b0 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
106c0 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b  han key2.  The {
106d0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
106e0 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
106f0 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
10700 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  h OP_MakeRecord 
10710 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
10720 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
10730 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
10740 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
10750 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
10760 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
10770 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
10780 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
10790 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
107a0 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
107b0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
107c0 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69  s..** The key wi
107d0 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20  th fewer fields 
107e0 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61  is usually compa
107f0 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  res less than th
10800 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79  e .** longer key
10810 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68  .  However if th
10820 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  e UNPACKED_INCRK
10830 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65  EY flags in pPKe
10840 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64  y2 is set.** and
10850 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
10860 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ixes are equal, 
10870 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73  then key1 is les
10880 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20  s than key2..** 
10890 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b  Or if the UNPACK
108a0 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20  ED_MATCH_PREFIX 
108b0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
108c0 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65  the prefixes are
108d0 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  .** equal, then 
108e0 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e  the keys are con
108f0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71  sidered to be eq
10900 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70  ual and.** the p
10910 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20  arts beyond the 
10920 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72  common prefix ar
10930 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  e ignored..**.**
10940 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
10950 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c  _IGNORE_ROWID fl
10960 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
10970 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
10980 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f  .** the header o
10990 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72  f pKey1 is ignor
109a0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
109b0 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73  ed that pKey1 is
109c0 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  .** an index key
109d0 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20  , and thus ends 
109e0 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c  with a rowid val
109f0 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79  ue.  The last by
10a00 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61  te.** of the hea
10a10 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f  der will therefo
10a20 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c  re be the serial
10a30 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
10a40 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c  id:.** one of 1,
10a50 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20   2, 3, 4, 5, 6, 
10a60 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e  8, or 9 - the in
10a70 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70  teger serial typ
10a80 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61  es..** The seria
10a90 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69  l type of the fi
10aa0 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61  nal rowid will a
10ab0 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c  lways be a singl
10ac0 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67  e byte..** By ig
10ad0 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74  noring this last
10ae0 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
10af0 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68  der, we force th
10b00 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  e comparison.** 
10b10 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f  to ignore the ro
10b20 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
10b30 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73  f key1..*/.int s
10b40 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
10b50 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
10b60 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
10b70 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
10b80 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
10b90 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
10ba0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
10bb0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32   key */.){.  u32
10bc0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
10bd0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
10be0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
10bf0 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
10c00 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
10c10 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
10c20 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
10c30 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
10c40 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
10c50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10c60 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
10c70 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
10c80 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
10c90 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
10ca0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
10cb0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
10cc0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
10cd0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
10ce0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
10cf0 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
10d00 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
10d10 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
10d20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
10d30 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
10d40 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
10d50 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67  >db;.  mem1.flag
10d60 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d  s = 0;.  mem1.zM
10d70 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20  alloc = 0;.  .  
10d80 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
10d90 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
10da0 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
10db0 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
10dc0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
10dd0 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b  _IGNORE_ROWID ){
10de0 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20  .    szHdr1--;. 
10df0 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b   }.  nField = pK
10e00 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
10e10 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
10e20 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
10e30 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
10e40 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
10e50 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
10e60 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
10e70 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
10e80 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
10e90 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
10ea0 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
10eb0 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
10ec0 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66  _type1 );.    if
10ed0 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
10ee0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10ef0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
10f00 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
10f10 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
10f20 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
10f30 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
10f40 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
10f50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
10f60 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
10f70 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
10f80 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
10f90 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
10fa0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10fb0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
10fc0 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
10fd0 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20  aMem[i],.       
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70      i<nField ? p
11000 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
11010 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ] : 0);.    if( 
11020 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  rc!=0 ){.      b
11030 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11040 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  i++;.  }.  if( m
11050 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  em1.zMalloc ) sq
11060 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
11070 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69  ase(&mem1);..  i
11080 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
11090 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
110a0 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  ans that one of 
110b0 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
110c0 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
110d0 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69     ** all the fi
110e0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
110f0 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
11100 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  . If the UNPACKE
11110 44 5f 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a  D_INCRKEY.    **
11120 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
11130 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65  en break the tie
11140 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79   by treating key
11150 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 20  2 as larger..   
11160 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b   ** If the UPACK
11170 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
11180 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
11190 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d  n keys with comm
111a0 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 20 20  on prefixes.    
111b0 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ** are considere
111c0 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20  d to be equal.  
111d0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c  Otherwise, the l
111e0 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65  onger key is the
111f0 20 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e   .    ** larger.
11200 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c    As it happens,
11210 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c   the pPKey2 will
11220 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c   always be the l
11230 6f 6e 67 65 72 0a 20 20 20 20 2a 2a 20 69 66 20  onger.    ** if 
11240 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65  there is a diffe
11250 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  rence..    */.  
11260 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
11270 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
11280 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 20 20  NCRKEY ){.      
11290 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  rc = -1;.    }el
112a0 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
112b0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
112c0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
112d0 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72        /* Leave r
112e0 63 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  c==0 */.    }els
112f0 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72  e if( idx1<szHdr
11300 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
11310 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
11320 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
11330 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70  SortOrder && i<p
11340 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a  KeyInfo->nField.
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
11360 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
11370 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
11380 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a   rc = -rc;.  }..
11390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
113a0 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
113b0 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
113c0 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
113d0 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
113e0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
113f0 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
11400 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
11410 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
11420 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
11430 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
11440 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
11450 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
11460 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
11470 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
11480 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
11490 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  xRowid(BtCursor 
114a0 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
114b0 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
114c0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
114d0 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
114e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
114f0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
11500 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
11510 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
11520 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
11530 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
11540 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
11550 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
11560 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c  Mem m, v;..  sql
11570 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
11580 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
11590 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
115a0 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y<=0 ){.    retu
115b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
115c0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 2e  T_BKPT;.  }.  m.
115d0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64  flags = 0;.  m.d
115e0 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c  b = 0;.  m.zMall
115f0 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  oc = 0;.  rc = s
11600 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
11610 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
11620 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
11630 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
11640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11650 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
11660 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
11670 7a 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67  zHdr);.  (void)g
11680 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
11690 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
116a0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e  ypeRowid);.  len
116b0 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
116c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
116d0 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73  (typeRowid);.  s
116e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
116f0 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
11700 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
11710 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
11720 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
11730 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
11740 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
11750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11760 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
11770 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
11780 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
11790 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
117a0 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  int to against.*
117b0 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
117c0 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e   in pKey (of len
117d0 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74  gth nKey).  Writ
117e0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
117f0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
11800 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
11810 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
11820 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
11830 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
11840 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b   greater than pK
11850 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ey.  Return SQLI
11860 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
11870 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20  ..**.** pKey is 
11880 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
11890 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
118a0 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
118b0 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
118c0 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
118d0 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
118e0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
118f0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
11900 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
11910 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
11920 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
11930 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
11940 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
11950 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
11960 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
11970 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
11980 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  e key..**.** pUn
11990 70 61 63 6b 65 64 20 6d 61 79 20 62 65 20 61 6e  packed may be an
119a0 20 75 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   unpacked versio
119b0 6e 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  n of pKey,nKey. 
119c0 20 49 66 20 70 55 6e 70 61 63 6b 65 64 20 69 73   If pUnpacked is
119d0 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 69 74 20  .** supplied it 
119e0 69 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  is used in place
119f0 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 0a 2a   of pKey,nKey..*
11a00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
11a10 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
11a20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
11a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11a40 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
11a50 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
11a60 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
11a70 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
11a80 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
11a90 69 6f 6e 20 6f 66 20 70 4b 65 79 20 61 6e 64 20  ion of pKey and 
11aa0 6e 4b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  nKey */.  int *r
11ab0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
11ac0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11ad0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
11ae0 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
11af0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
11b00 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
11b10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
11b20 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
11b30 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  Mem m;..  sqlite
11b40 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
11b50 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
11b60 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
11b70 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  0 ){.    *res = 
11b80 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
11b90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d  LITE_OK;.  }.  m
11ba0 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61  .db = 0;.  m.fla
11bb0 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c  gs = 0;.  m.zMal
11bc0 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  loc = 0;.  rc = 
11bd0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
11be0 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
11bf0 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  sor, 0, nCellKey
11c00 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
11c10 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11c20 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
11c30 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
11c40 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
11c50 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20  GNORE_ROWID );. 
11c60 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
11c70 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11c80 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
11c90 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
11ca0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
11cb0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
11cc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11cd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
11ce0 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
11cf0 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
11d00 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
11d10 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
11d20 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
11d30 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
11d40 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
11d50 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
11d60 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
11d70 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
11d80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11d90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
11da0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
11db0 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
11dc0 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
11dd0 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
11de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
11df0 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
11e00 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
11e10 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
11e20 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
11e30 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
11e40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11e50 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
11e60 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
11e70 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
11e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
11e90 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
11ea0 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
11eb0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
11ec0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
11ed0 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
11ee0 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
11ef0 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
11f00 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
11f10 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
11f20 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
11f30 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
11f40 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
11f50 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
11f60 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
11f70 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
11f80 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
11f90 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
11fa0 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
11fb0 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
11fc0 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
11fd0 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
11fe0 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
11ff0 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
12000 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
12010 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
12020 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
12030 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
12040 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
12050 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
12060 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
12070 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
12080 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
12090 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
120a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
120b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
120c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
120d0 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
120e0 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
120f0 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
12100 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a     eturn v->db;.}.