/ Hex Artifact Content
Login

Artifact 706d722088350fe18bc9c41250b4f19509f00390:


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 30 31 20 32  eaux.c,v 1.401 2
02c0: 30 30 38 2f 30 37 2f 32 38 20 31 39 3a 33 34 3a  008/07/28 19:34:
02d0: 35 34 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  54 drh Exp $.*/.
02e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0300: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0310: 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a  de "vdbeInt.h"..
0320: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65 62  ../*.** When deb
0330: 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65 20  ugging the code 
0340: 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20 73  generator in a s
0350: 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65 72  ymbolic debugger
0360: 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65 74  , one can.** set
0370: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
0380: 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20 31 20  AddopTrace to 1 
0390: 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  and all opcodes 
03a0: 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 64 0a  will be printed.
03b0: 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65 20 61  ** as they are a
03c0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 73 74  dded to the inst
03d0: 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d 2e 0a  ruction stream..
03e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
03f0: 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
0400: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
0410: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f   = 0;.#endif.../
0420: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
0430: 77 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  w virtual databa
0440: 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64  se engine..*/.Vd
0450: 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 43  be *sqlite3VdbeC
0460: 72 65 61 74 65 28 73 71 6c 69 74 65 33 20 2a 64  reate(sqlite3 *d
0470: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
0480: 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
0490: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
04a0: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
04b0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
04c0: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04d0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04e0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04f0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
0500: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
0510: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
0520: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0530: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0540: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0550: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0560: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
0570: 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20  emember the SQL 
0580: 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65  string for a pre
0590: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
05a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
05b0: 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 65 20  VdbeSetSql(Vdbe 
05c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
05d0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28  z, int n){.  if(
05e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
05f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0600: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0610: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0620: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
0640: 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63  rn the SQL assoc
0650: 69 61 74 65 64 20 77 69 74 68 20 61 20 70 72 65  iated with a pre
0660: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
0670: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
0680: 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74  qlite3_sql(sqlit
0690: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
06a0: 0a 20 20 72 65 74 75 72 6e 20 28 28 56 64 62 65  .  return ((Vdbe
06b0: 20 2a 29 70 53 74 6d 74 29 2d 3e 7a 53 71 6c 3b   *)pStmt)->zSql;
06c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61  .}../*.** Swap a
06d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65  ll content betwe
06e0: 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74 72 75  en two VDBE stru
06f0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0700: 73 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28  sqlite3VdbeSwap(
0710: 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a  Vdbe *pA, Vdbe *
0720: 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c  pB){.  Vdbe tmp,
0730: 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a   *pTmp;.  char *
0740: 7a 54 6d 70 3b 0a 20 20 69 6e 74 20 6e 54 6d 70  zTmp;.  int nTmp
0750: 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20  ;.  tmp = *pA;. 
0760: 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70   *pA = *pB;.  *p
0770: 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20  B = tmp;.  pTmp 
0780: 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pA->pNext;.  p
0790: 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70  A->pNext = pB->p
07a0: 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78  Next;.  pB->pNex
07b0: 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70  t = pTmp;.  pTmp
07c0: 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20   = pA->pPrev;.  
07d0: 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e  pA->pPrev = pB->
07e0: 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72  pPrev;.  pB->pPr
07f0: 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d  ev = pTmp;.  zTm
0800: 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20  p = pA->zSql;.  
0810: 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a  pA->zSql = pB->z
0820: 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20  Sql;.  pB->zSql 
0830: 3d 20 7a 54 6d 70 3b 0a 20 20 6e 54 6d 70 20 3d  = zTmp;.  nTmp =
0840: 20 70 41 2d 3e 6e 53 71 6c 3b 0a 20 20 70 41 2d   pA->nSql;.  pA-
0850: 3e 6e 53 71 6c 20 3d 20 70 42 2d 3e 6e 53 71 6c  >nSql = pB->nSql
0860: 3b 0a 20 20 70 42 2d 3e 6e 53 71 6c 20 3d 20 6e  ;.  pB->nSql = n
0870: 54 6d 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Tmp;.}..#ifdef S
0880: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0890: 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67 20 6f  * Turn tracing o
08a0: 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64  n or off.*/.void
08b0: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
08c0: 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c 45 20  e(Vdbe *p, FILE 
08d0: 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72  *trace){.  p->tr
08e0: 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 23  ace = trace;.}.#
08f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  endif../*.** Res
0900: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70  ize the Vdbe.aOp
0910: 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 69   array so that i
0920: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
0930: 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ast N.** element
0940: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  s..**.** If an o
0950: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
0960: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
0970: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0980: 61 79 2c 0a 2a 2a 20 56 64 62 65 2e 61 4f 70 20  ay,.** Vdbe.aOp 
0990: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
09a0: 63 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  c remain unchang
09b0: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
09c0: 68 61 74 0a 2a 2a 20 61 6e 79 20 6f 70 63 6f 64  hat.** any opcod
09d0: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
09e0: 61 74 65 64 20 63 61 6e 20 62 65 20 63 6f 72 72  ated can be corr
09f0: 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65  ectly deallocate
0a00: 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
0a10: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
0a20: 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vdbe)..*/.static
0a30: 20 76 6f 69 64 20 72 65 73 69 7a 65 4f 70 41 72   void resizeOpAr
0a40: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
0a50: 20 4e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70   N){.  VdbeOp *p
0a60: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
0a70: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0a80: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 4e 2a  ->db, p->aOp, N*
0a90: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69  sizeof(Op));.  i
0aa0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
0ab0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 4e 3b 0a  ->nOpAlloc = N;.
0ac0: 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65      p->aOp = pNe
0ad0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
0ae0: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75  Add a new instru
0af0: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73  ction to the lis
0b00: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
0b10: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65  s current in the
0b20: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72  .** VDBE.  Retur
0b30: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
0b40: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
0b50: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  tion..**.** Para
0b60: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  meters:.**.**   
0b70: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20   p              
0b80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
0b90: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70  VDBE.**.**    op
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
0bb0: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69  e opcode for thi
0bc0: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
0bd0: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70  .**    p1, p2, p
0be0: 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a  3      Operands.
0bf0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0c00: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0c10: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0c20: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0c30: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0c40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0c50: 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  4() function to 
0c60: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0c70: 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70   of the P4.** op
0c80: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0ca0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0cb0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c   int p1, int p2,
0cc0: 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20   int p3){.  int 
0cd0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  i;.  VdbeOp *pOp
0ce0: 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b  ;..  i = p->nOp;
0cf0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
0d00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
0d10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
0d20: 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a  >nOpAlloc<=i ){.
0d30: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
0d40: 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  y(p, p->nOpAlloc
0d50: 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   ? p->nOpAlloc*2
0d60: 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f   : 1024/sizeof(O
0d70: 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p));.    if( p->
0d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0d90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0da0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0db0: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
0dc0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0dd0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70  pOp->opcode = op
0de0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0df0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0e00: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0e10: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0e20: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0e30: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0e40: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0e50: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0e60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0e70: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0e80: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0ea0: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0eb0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0ec0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0ed0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0ee0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0ef0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0f00: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
0f10: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
0f20: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0f30: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
0f40: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
0f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0f60: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
0f70: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
0f80: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
0f90: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
0fa0: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
0fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
0fc0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
0fd0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
0fe0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
0ff0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1000: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1020: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1030: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1040: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1050: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1060: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1070: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1080: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1090: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10b0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
10c0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
10d0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
10e0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
10f0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1110: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1120: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1140: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1150: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1160: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1170: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1180: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1190: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
11a0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
11c0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
11d0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
11e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11f0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1200: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1210: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1220: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1230: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1250: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
1260: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
1270: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
1280: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
1290: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
12a0: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
12b0: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
12c0: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
12d0: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
12e0: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
12f0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
1300: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
1310: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
1320: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
1330: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
1340: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
1350: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
1360: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
1370: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
1380: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
1390: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
13a0: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
13b0: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
13c0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
13d0: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
13e0: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
13f0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
1400: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
1410: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
1420: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
1430: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
1440: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
1450: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
1460: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1470: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
1480: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
1490: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
14a0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
14b0: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  c() fails..*/.in
14c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
14d0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b  eLabel(Vdbe *p){
14e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
14f0: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1500: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1510: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1520: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
1530: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20  nLabelAlloc ){. 
1540: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
1550: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
1560: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 70  oc*2 + 10;.    p
1570: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1580: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1590: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
15a0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 61 62 65          p->nLabe
15d0: 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d  lAlloc*sizeof(p-
15e0: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
15f0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1600: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1610: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1620: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1630: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1640: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1650: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1660: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1670: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1680: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1690: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
16a0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
16b0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
16c0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
16d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
16e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1700: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1710: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1720: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1730: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1740: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1750: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1760: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1770: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1780: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1790: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
17a0: 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  /*.** Loop throu
17b0: 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c  gh the program l
17c0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61  ooking for P2 va
17d0: 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65  lues that are ne
17e0: 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d  gative.** on jum
17f0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  p instructions. 
1800: 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65   Each such value
1810: 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65   is a label.  Re
1820: 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62  solve the.** lab
1830: 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  el by setting th
1840: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74  e P2 value to it
1850: 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65  s correct non-ze
1860: 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
1870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1880: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65  called once afte
1890: 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61  r all opcodes ha
18a0: 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  ve been inserted
18b0: 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65  ..**.** Variable
18c0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69   *pMaxFuncArgs i
18d0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78  s set to the max
18e0: 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e  imum value of an
18f0: 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a  y P2 argument .*
1900: 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74  * to an OP_Funct
1910: 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20  ion, OP_AggStep 
1920: 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70  or OP_VFilter op
1930: 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73  code. This is us
1940: 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65  ed by .** sqlite
1950: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29  3VdbeMakeReady()
1960: 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62   to size the Vdb
1970: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e  e.apArg[] array.
1980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1990: 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68  ine also does th
19a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69  e following opti
19b0: 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63  mization:  It sc
19c0: 61 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73 74 72  ans for.** instr
19d0: 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  uctions that mig
19e0: 68 74 20 63 61 75 73 65 20 61 20 73 74 61 74 65  ht cause a state
19f0: 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  ment rollback.  
1a00: 53 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  Such instruction
1a10: 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  s.** are:.**.** 
1a20: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74    *  OP_Halt wit
1a30: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
1a40: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
1a50: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
1a60: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
1a70: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
1a80: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
1a90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 63  .**.** If no suc
1aa0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
1ab0: 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65   found, then eve
1ac0: 72 79 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73  ry Statement ins
1ad0: 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  truction .** is 
1ae0: 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f  changed to a Noo
1af0: 70 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  p.  In this way,
1b00: 20 77 65 20 61 76 6f 69 64 20 63 72 65 61 74 69   we avoid creati
1b10: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
1b20: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
1b30: 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e  e unnecessarily.
1b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b50: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
1b70: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
1b80: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nt i;.  int nMax
1b90: 41 72 67 73 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  Args = 0;.  Op *
1ba0: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
1bb0: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
1bc0: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
1bd0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
1be0: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
1bf0: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
1c00: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
1c10: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
1c20: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
1c30: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
1c40: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
1c50: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1c60: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
1c70: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
1c80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1c90: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
1ca0: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
1cb0: 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  5;.#ifndef SQLIT
1cc0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1cd0: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
1ce0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
1cf0: 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66  date ){.      if
1d00: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
1d10: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
1d20: 70 4f 70 2d 3e 70 32 3b 0a 23 65 6e 64 69 66 0a  pOp->p2;.#endif.
1d30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
1d40: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b  code==OP_Halt ){
1d50: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1d60: 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  p1==SQLITE_CONST
1d70: 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32  RAINT && pOp->p2
1d80: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
1d90: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
1da0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
1db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1dc0: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
1dd0: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
1de0: 20 20 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e       hasStatemen
1df0: 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20  tBegin = 1;.    
1e00: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1e10: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a  ==OP_Destroy ){.
1e20: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
1e30: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
1e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e50: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e60: 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
1e70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
1e80: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
1e90: 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  _VRename ){.    
1ea0: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1eb0: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1ec0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1ed0: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
1ee0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1ef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
1f00: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
1f10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
1f20: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
1f30: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
1f40: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
1f50: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
1f60: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
1f70: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
1f80: 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
1f90: 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73  te3VdbeOpcodeHas
1fa0: 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65 2c  Property(opcode,
1fb0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26 26 20   OPFLG_JUMP) && 
1fc0: 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20  pOp->p2<0 ){.   
1fd0: 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f     assert( -1-pO
1fe0: 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20  p->p2<p->nLabel 
1ff0: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  );.      pOp->p2
2000: 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70   = aLabel[-1-pOp
2010: 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->p2];.    }.  }
2020: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2030: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
2040: 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20  l);.  p->aLabel 
2050: 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e  = 0;..  *pMaxFun
2060: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
2070: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65  ;..  /* If we ne
2080: 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73  ver rollback a s
2090: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
20a0: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65  tion, then state
20b0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
20c0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e  ctions are not n
20d0: 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67  eeded.  So chang
20e0: 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65  e every OP_State
20f0: 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ment.  ** opcode
2100: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2110: 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20  .  This avoid a 
2120: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2130: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2140: 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20  .  ** which can 
2150: 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20  be expensive on 
2160: 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a  some platforms..
2170: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74    */.  if( hasSt
2180: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20  atementBegin && 
2190: 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f  !doesStatementRo
21a0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
21b0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
21c0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
21d0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
21e0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
21f0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
2200: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   ){.        pOp-
2210: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
2220: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2230: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2240: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
2250: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2260: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
2270: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
2280: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2290: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
22a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
22b0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
22c0: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
22d0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
22e0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
22f0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
2300: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2310: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2320: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2330: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2340: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2360: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
2370: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
2380: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
2390: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
23a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
23b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
23c0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
23d0: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e  nOp + nOp > p->n
23e0: 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 72  OpAlloc ){.    r
23f0: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20  esizeOpArray(p, 
2400: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d  p->nOpAlloc ? p-
2410: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30  >nOpAlloc*2 : 10
2420: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  24/sizeof(Op));.
2430: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2440: 4f 70 2b 6e 4f 70 3c 3d 70 2d 3e 6e 4f 70 41 6c  Op+nOp<=p->nOpAl
2450: 6c 6f 63 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  loc || p->db->ma
2460: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
2470: 7d 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  }.  if( p->db->m
2480: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2490: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
24a0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
24b0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b  ;.  if( nOp>0 ){
24c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24d0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
24e0: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
24f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
2500: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
2510: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
2520: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
2530: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
2540: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
2550: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
2560: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
2570: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
2580: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
2590: 28 20 70 32 3c 30 20 26 26 20 73 71 6c 69 74 65  ( p2<0 && sqlite
25a0: 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72  3VdbeOpcodeHasPr
25b0: 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63  operty(pOut->opc
25c0: 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  ode, OPFLG_JUMP)
25d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74   ){.        pOut
25e0: 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44  ->p2 = addr + AD
25f0: 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65  DR(p2);.      }e
2600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75  lse{.        pOu
2610: 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20  t->p2 = p2;.    
2620: 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e    }.      pOut->
2630: 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20  p3 = pIn->p3;.  
2640: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
2650: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
2660: 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20       pOut->p4.p 
2670: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  = 0;.      pOut-
2680: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
2690: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
26a0: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
26b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
26c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
26d0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
26e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
26f0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
2700: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
2710: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2720: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
2730: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
2740: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
2750: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2760: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
2770: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
2780: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
2790: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
27a0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
27b0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
27c0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
27d0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
27e0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
27f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
2800: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
2810: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
2820: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
2830: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  e program..*/.vo
2840: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2850: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
2860: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
2870: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
2880: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
2890: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
28a0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
28b0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
28c0: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
28d0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
28e0: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
28f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2900: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2910: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
2920: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2930: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
2940: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
2950: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
2960: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
2970: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2980: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
2990: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
29a0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
29b0: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
29c0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
29d0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
29e0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
29f0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
2a00: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
2a10: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
2a20: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
2a30: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2a40: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
2a50: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2a60: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2a70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a80: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
2a90: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2aa0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2ab0: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
2ac0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2ad0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2ae0: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2af0: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2b00: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2b10: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
2b20: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2b30: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2b40: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
2b50: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
2b60: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
2b70: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
2b80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2b90: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
2ba0: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
2bb0: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2bc0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2bd0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2be0: 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  p && p->aOp ){. 
2bf0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
2c00: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
2c10: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
2c20: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2c30: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
2c40: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
2c50: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
2c60: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2c70: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
2c80: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2c90: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
2ca0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
2cb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2cc0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
2cd0: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
2ce0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
2cf0: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
2d00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
2d10: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
2d20: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
2d30: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
2d40: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
2d50: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
2d60: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
2d70: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
2d80: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
2d90: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
2da0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
2db0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
2dc0: 70 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e 66  pDef && (pDef->f
2dd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2de0: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
2df0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e00: 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d  e(db, pDef);.  }
2e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2e20: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
2e30: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
2e40: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
2e50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2e60: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
2e70: 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a  4){.  if( p4 ){.
2e80: 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79      switch( p4ty
2e90: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
2ea0: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20   P4_REAL:.      
2eb0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
2ec0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52       case P4_MPR
2ed0: 49 4e 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65  INTF:.      case
2ee0: 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20   P4_DYNAMIC:.   
2ef0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
2f00: 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  FO:.      case P
2f10: 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20  4_INTARRAY:.    
2f20: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
2f30: 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20  O_HANDOFF: {.   
2f40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2f50: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20  ee(db, p4);.    
2f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2f70: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
2f80: 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20  _VDBEFUNC: {.   
2f90: 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70       VdbeFunc *p
2fa0: 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65  VdbeFunc = (Vdbe
2fb0: 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20  Func *)p4;.     
2fc0: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
2fd0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64  Function(db, pVd
2fe0: 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a  beFunc->pFunc);.
2ff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3000: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
3010: 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a  (pVdbeFunc, 0);.
3020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3030: 62 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46  bFree(db, pVdbeF
3040: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  unc);.        br
3050: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3060: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
3070: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
3080: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3090: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
30a0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
30b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
30c0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
30d0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
30e0: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
30f0: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b  ite3_value*)p4);
3100: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3110: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3120: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  }.}.../*.** Chan
3130: 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61  ge N opcodes sta
3140: 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f  rting at addr to
3150: 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64   No-ops..*/.void
3160: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3170: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
3180: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
3190: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  N){.  if( p && p
31a0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
31b0: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
31c0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
31d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
31e0: 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  b;.    while( N-
31f0: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
3200: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
3210: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
3220: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
3230: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
3240: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
3250: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
3260: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
3270: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3280: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3290: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
32a0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
32b0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
32c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
32d0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
32e0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
32f0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
3300: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
3310: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
3320: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
3330: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
3340: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
3350: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
3360: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
3370: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
3380: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
3390: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
33a0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
33b0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
33c0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
33d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
33e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
33f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
3400: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
3410: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
3420: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
3430: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
3440: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
3450: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
3460: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
3470: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
3480: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
3490: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
34a0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
34b0: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
34c0: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
34d0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
34e0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
34f0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
3500: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
3510: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
3520: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
3530: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
3540: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
3550: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
3560: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
3570: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3580: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
3590: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
35a0: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
35b0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
35c0: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
35d0: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
35e0: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
35f0: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
3600: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3610: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3620: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3630: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3640: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
3650: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
3660: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
3670: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
3680: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
3690: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
36a0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
36b0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
36c0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
36d0: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
36e0: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
36f0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
3700: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3710: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
3720: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3730: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3740: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
3760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3770: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
3780: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
3790: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
37a0: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
37b0: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
37c0: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
37d0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
37e0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
37f0: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
3800: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
3810: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20 21  d ){.    if (n !
3820: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a  = P4_KEYINFO) {.
3830: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
3840: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
3850: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
3860: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3870: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
3880: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
3890: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
38a0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
38b0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20  .    if( addr<0 
38c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
38d0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
38e0: 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62  dr];.  freeP4(db
38f0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
3900: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
3910: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
3920: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
3930: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
3940: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
3950: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
3960: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
3970: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
3980: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
3990: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
39a0: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
39b0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
39c0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
39d0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
39e0: 20 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   n;.  }else if( 
39f0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
3a00: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
3a10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3a20: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
3a30: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
3a40: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
3a50: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
3a60: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e     int nField, n
3a70: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c  Byte;..    nFiel
3a80: 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a  d = ((KeyInfo*)z
3a90: 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20  P4)->nField;.   
3aa0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
3ab0: 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46  *pKeyInfo) + (nF
3ac0: 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70  ield-1)*sizeof(p
3ad0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
3ae0: 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ]) + nField;.   
3af0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
3b00: 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  te3Malloc( nByte
3b10: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
3b20: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
3b30: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
3b40: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
3b50: 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  8 *aSortOrder;. 
3b60: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3b70: 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65  Info, zP4, nByte
3b80: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
3b90: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
3ba0: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3bb0: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
3bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
3bd0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3be0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3bf0: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
3c00: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
3c10: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3c20: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3c30: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
3c40: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
3c50: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3c60: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
3c70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3c80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3c90: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
3ca0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3cb0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3cc0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
3cd0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3ce0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3cf0: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
3d00: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3d10: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
3d20: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3d30: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3d40: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
3d50: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e   pOp->p4type = n
3d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d70: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74  f( n==0 ) n = st
3d80: 72 6c 65 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70  rlen(zP4);.    p
3d90: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
3da0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
3db0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
3dc0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3dd0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3de0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3df0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3e00: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
3e10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3e20: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
3e30: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
3e40: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
3e50: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
3e60: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
3e70: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
3e80: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
3e90: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
3ea0: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
3eb0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
3ec0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
3ed0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
3ee0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ef0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
3f00: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3f10: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
3f20: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3f30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
3f40: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
3f50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
3f60: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
3f70: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
3f80: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
3f90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3fa0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
3fb0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
3fc0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3fd0: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
3fe0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
3ff0: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
4000: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
4010: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
4020: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
4030: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
4040: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
4050: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
4060: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
4070: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
4080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
4090: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
40a0: 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65  ist ap;.  sqlite
40b0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
40c0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72  P_Noop);.  asser
40d0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
40e0: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
40f0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
4100: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
4110: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
4120: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
4130: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
4140: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
4150: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
4160: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4170: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
4180: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
4190: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
41a0: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
41b0: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
41c0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
41d0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
41e0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
41f0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
4200: 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
4210: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f   Return the opco
4220: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61  de for a given a
4230: 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f  ddress..*/.VdbeO
4240: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
4250: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
4260: 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74   addr){.  assert
4270: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4280: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
4290: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
42a0: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
42b0: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
42c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 65  ocFailed );.  re
42d0: 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26  turn ((addr>=0 &
42e0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28  & addr<p->nOp)?(
42f0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30  &p->aOp[addr]):0
4300: 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  );.}..#if !defin
4310: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
4320: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
4330: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
4340: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
4350: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
4360: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
4370: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
4380: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
4390: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
43a0: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
43b0: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
43c0: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
43d0: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
43e0: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
43f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
4400: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
4410: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
4420: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
4430: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
4440: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
4450: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
4460: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
4470: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
4480: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
4490: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
44a0: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
44b0: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
44c0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
44d0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
44e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
44f0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4500: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
4510: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
4520: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
4530: 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a   strlen(zTemp);.
4540: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4550: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
4560: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4570: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
4580: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
4590: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
45a0: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
45b0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
45c0: 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  len(pColl->zName
45d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
45e0: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
4600: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
4610: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
4620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4640: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
4650: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
4660: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4670: 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66  Order && pKeyInf
4680: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
4690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
46a0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
46b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
46c0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
46d0: 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d  zTemp[i], pColl-
46e0: 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20  >zName,n+1);.   
46f0: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
4700: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
4710: 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+4<nTemp-6 ){.
4720: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
4730: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c  (&zTemp[i],",nil
4740: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
4750: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
4760: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4770: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
4780: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
4790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
47a0: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
47b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
47c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  }.    case P4_CO
47d0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
47e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
47f0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
4800: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4810: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4820: 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32  mp, "collseq(%.2
4830: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
4840: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
4850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4860: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
4870: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
4880: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
4890: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
48a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
48b0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
48c0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
48d0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
48e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
48f0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
4900: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
4910: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4920: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
4930: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
4940: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4950: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4960: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
4970: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4980: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4990: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
49a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
49c0: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
49d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
49e0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
49f0: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
4a00: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
4a10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4a20: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
4a30: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
4a40: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
4a50: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
4a60: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
4a70: 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ll)==0 );.      
4a80: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4a90: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
4aa0: 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d       zP4 = pMem-
4ab0: 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  >z;.      }else 
4ac0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4ad0: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
4ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4af0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4b00: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  mp, "%lld", pMem
4b10: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
4b20: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
4b30: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
4b40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4b50: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4b60: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
4b70: 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  , pMem->r);.    
4b80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4b90: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
4ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4bb0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
4bc0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
4bd0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
4be0: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
4bf0: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  pVtab;.      sql
4c00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4c10: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61  emp, zTemp, "vta
4c20: 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c  b:%p:%p", pVtab,
4c30: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29   pVtab->pModule)
4c40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4c60: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
4c70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4c80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4c90: 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72  , zTemp, "intarr
4ca0: 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ay");.      brea
4cb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
4cc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
4cd0: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
4ce0: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
4cf0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
4d00: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
4d10: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
4d20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4d30: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
4d40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
4d50: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4d60: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
4d70: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
4d80: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
4d90: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
4da0: 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71  d..**.*/.void sq
4db0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
4dc0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
4dd0: 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  i){.  int mask;.
4de0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
4df0: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29  & i<p->db->nDb )
4e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73 69  ;.  assert( i<si
4e10: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
4e20: 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d  k)*8 );.  mask =
4e30: 20 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d   1<<i;.  if( (p-
4e40: 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73  >btreeMask & mas
4e50: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  k)==0 ){.    p->
4e60: 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  btreeMask |= mas
4e70: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  k;.    sqlite3Bt
4e80: 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73  reeMutexArrayIns
4e90: 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20  ert(&p->aMutex, 
4ea0: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
4eb0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20  t);.  }.}...#if 
4ec0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
4ed0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
4ee0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
4ef0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
4f00: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
4f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4f20: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
4f30: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
4f40: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4f50: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
4f60: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
4f70: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
4f80: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
4f90: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4fa0: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
4fb0: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
4fc0: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
4fd0: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
4fe0: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
4ff0: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
5000: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
5010: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
5020: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
5030: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
5040: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
5050: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
5060: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
5070: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
5080: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
5090: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
50a0: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
50b0: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
50c0: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
50d0: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
50e0: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
50f0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
5100: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
5110: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
5120: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
5130: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
5140: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
5150: 69 6e 74 20 4e 2c 20 69 6e 74 20 66 72 65 65 62  int N, int freeb
5160: 75 66 66 65 72 73 29 7b 0a 20 20 69 66 28 20 70  uffers){.  if( p
5170: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 73 71 6c   && N ){.    sql
5180: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5190: 3b 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63  ;.    int malloc
51a0: 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  _failed = db->ma
51b0: 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
51c0: 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a  while( N-->0 ){.
51d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c        assert( N<
51e0: 32 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  2 || p[0].db==p[
51f0: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 69  1].db );.      i
5200: 66 28 20 66 72 65 65 62 75 66 66 65 72 73 20 29  f( freebuffers )
5210: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5220: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
5230: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
5240: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5250: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 45 78  VdbeMemReleaseEx
5260: 74 65 72 6e 61 6c 28 70 29 3b 0a 20 20 20 20 20  ternal(p);.     
5270: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67   }.      p->flag
5280: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
5290: 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20      p++;.    }. 
52a0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
52b0: 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69  led = malloc_fai
52c0: 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  led;.  }.}..#ifd
52d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
52e0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
52f0: 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  NT.int sqlite3Vd
5300: 62 65 52 65 6c 65 61 73 65 42 75 66 66 65 72 73  beReleaseBuffers
5310: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5320: 20 69 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65   ii;.  int nFree
5330: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
5340: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5350: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
5360: 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20   );.  for(ii=1; 
5370: 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b  ii<=p->nMem; ii+
5380: 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65  +){.    Mem *pMe
5390: 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d  m = &p->aMem[ii]
53a0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
53b0: 7a 20 26 26 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  z && pMem->flags
53c0: 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20  &MEM_Dyn ){.    
53d0: 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 2d    assert( !pMem-
53e0: 3e 78 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 6e  >xDel );.      n
53f0: 46 72 65 65 20 2b 3d 20 73 71 6c 69 74 65 33 44  Free += sqlite3D
5400: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d  bMallocSize(pMem
5410: 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 29 3b 0a  ->db, pMem->z);.
5420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5430: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
5440: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5450: 65 74 75 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23  eturn nFree;.}.#
5460: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
5470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
5480: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
5490: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
54a0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
54b0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
54c0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
54d0: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
54e0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
54f0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
5500: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
5510: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
5520: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
5530: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
5540: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
5550: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
5560: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
5570: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
5580: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
5590: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
55a0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
55b0: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
55c0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
55d0: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
55e0: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
55f0: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
5600: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
5610: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
5620: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
5630: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
5640: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
5650: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69  QUERY PLAN..*/.i
5660: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
5670: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
56a0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
56b0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  = p->db;.  int i
56c0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
56d0: 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70  ITE_OK;.  Mem *p
56e0: 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74  Mem = p->pResult
56f0: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
5700: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ];..  assert( p-
5710: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  >explain );.  if
5720: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
5730: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74  _MAGIC_RUN ) ret
5740: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
5750: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  E;.  assert( db-
5760: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
5770: 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61  AGIC_BUSY );.  a
5780: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
5790: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
57a0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  ==SQLITE_BUSY );
57b0: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
57c0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
57d0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
57e0: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
57f0: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
5800: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5810: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
5820: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
5830: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
5840: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
5850: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
5860: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
5870: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
5880: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
5890: 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65  ray(pMem, p->nMe
58a0: 6d 2c 20 31 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20  m, 1);..  do{.  
58b0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
58c0: 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f   }while( i<p->nO
58d0: 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  p && p->explain=
58e0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
58f0: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
5900: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  in );.  if( i>=p
5910: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->nOp ){.    p->
5920: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5930: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5940: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
5950: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
5960: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
5970: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
5980: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
5990: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
59a0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
59b0: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
59c0: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
59d0: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
59e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
59f0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
5a00: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
5a10: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ;.    if( p->exp
5a20: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
5a30: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5a40: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
5a50: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5a60: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  E_INTEGER;.     
5a70: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5aa0: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
5ab0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
5ac0: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
5ad0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
5ae0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
5af0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
5b00: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
5b10: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
5b20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f  pOp->opcode);  /
5b30: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
5b40: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
5b50: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
5b60: 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  em->n = strlen(p
5b70: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
5b80: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5b90: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
5ba0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
5bb0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
5bc0: 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  em++;.    }..   
5bd0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5be0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
5bf0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
5c20: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
5c30: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5c40: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
5c50: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
5c60: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
5c70: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
5c80: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ca0: 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P2 */.    pMem-
5cb0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
5cc0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
5cd0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
5ce0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
5cf0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5d00: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
5d10: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
5d20: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5d40: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P3 */.      pM
5d50: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5d60: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  E_INTEGER;.     
5d70: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a   pMem++;.    }..
5d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
5d90: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
5da0: 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20   32, 0) ){      
5db0: 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20        /* P4 */. 
5dc0: 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c       p->db->mall
5dd0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
5de0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5df0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
5e00: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5e10: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
5e20: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
5e30: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
5e40: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
5e50: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
5e60: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
5e70: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
5e80: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
5e90: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
5ea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5eb0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
5ec0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
5ed0: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
5ee0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
5ef0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
5f00: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
5f10: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5f20: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
5f30: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
5f40: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
5f50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5f60: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
5f70: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
5f80: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
5f90: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
5fa0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5fb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
5fc0: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
5fd0: 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45  ags = MEM_Dyn|ME
5fe0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
5ff0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
6000: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
6010: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
6020: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
6030: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
6040: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  */.      pMem->t
6050: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
6060: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
6070: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
6080: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
6090: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
60a0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28  _DEBUG.      if(
60b0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
60c0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
60d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
60e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
60f0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d    pMem->z = pOp-
6100: 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20  >zComment;.     
6110: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72     pMem->n = str
6120: 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  len(pMem->z);.  
6130: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
6140: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
6150: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
6160: 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
6170: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6180: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20  /* Comment */.  
61b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
61c0: 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a   = SQLITE_NULL;.
61d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
61e0: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
61f0: 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70   = 8 - 5*(p->exp
6200: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
6210: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6220: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6230: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
6240: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
6250: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
6260: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
6270: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
6280: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
6290: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
62a0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
62b0: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
62c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
62d0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
62e0: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
62f0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
6300: 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  pOp;.  if( nOp<1
6310: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
6320: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
6330: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
6340: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
6350: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
6360: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
6370: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
6380: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
6390: 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a  *(u8*)z) ) z++;.
63a0: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a      printf("SQL:
63b0: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20   [%s]\n", z);.  
63c0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
63d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
63e0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
63f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6400: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
6410: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
6420: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
6430: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
6440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6450: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
6460: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6470: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6480: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
6490: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
64a0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
64b0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
64c0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
64d0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
64e0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
64f0: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
6500: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
6510: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
6520: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
6530: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
6540: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
6550: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
6560: 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63   for(i=0; isspac
6570: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
6580: 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  )z[i]); i++){}. 
6590: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
65a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
65b0: 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ( isspace((unsig
65c0: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29  ned char)z[i]) )
65d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
65e0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
65f0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
6600: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
6610: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6620: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
6630: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
6640: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
6650: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
6660: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
6670: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
6680: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
6690: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
66a0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
66b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  .../*.** Prepare
66c0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
66d0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
66e0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
66f0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
6700: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
6710: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
6720: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
6730: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
6740: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
6750: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
6760: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
6770: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
6780: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
6790: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
67a0: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
67b0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
67c0: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
67d0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
67e0: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
67f0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69  AGIC_RUN..*/.voi
6800: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
6810: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
6820: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6830: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6840: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  VDBE */.  int nV
6850: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
6860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6870: 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e  er of '?' see in
6880: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
6890: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  nt */.  int nMem
68a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
68b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
68c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
68d0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
68e0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20    int nCursor,  
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
6910: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  rsors to allocat
6920: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70  e */.  int isExp
6930: 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
6940: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
6950: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
6960: 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74  words is present
6970: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
6980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6990: 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  p->db;..  assert
69a0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
69b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
69c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
69d0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
69e0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
69f0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
6a00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6a10: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
6a20: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
6a30: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
6a40: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
6a50: 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a  later. This.   *
6a60: 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
6a70: 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70  call to resizeOp
6a80: 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61  Array() below ma
6a90: 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20  y shrink the.   
6aa0: 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79  * p->aOp[] array
6ab0: 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20   to save memory 
6ac0: 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  if called when i
6ad0: 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  n VDBE_MAGIC_RUN
6ae0: 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20   .   * state..  
6af0: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
6b00: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
6b10: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
6b20: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
6b30: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
6b40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
6b50: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
6b60: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
6b70: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
6b80: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
6b90: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
6ba0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
6bb0: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
6bc0: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
6bd0: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
6be0: 20 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72   Cursor/BtCursor
6bf0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
6c00: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
6c10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6c20: 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69  .  ** cursor 0 i
6c30: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
6c40: 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65  ry cell nMem. Me
6c50: 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d  mory cell (nMem-
6c60: 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  1).  ** stores t
6c70: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
6c80: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
6c90: 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e  h cursor 1, etc.
6ca0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
6cb0: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
6cc0: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
6cd0: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a  em += nCursor;..
6ce0: 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
6cf0: 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72 20 72  tion space for r
6d00: 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  egisters..  */. 
6d10: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20   if( p->aMem==0 
6d20: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
6d30: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
6d40: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  m number of args
6d50: 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65   passed to a use
6d60: 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  r function. */. 
6d70: 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75     resolveP2Valu
6d80: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
6d90: 20 20 2f 2a 72 65 73 69 7a 65 4f 70 41 72 72 61    /*resizeOpArra
6da0: 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a  y(p, p->nOp);*/.
6db0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72      assert( nVar
6dc0: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >=0 );.    if( i
6dd0: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
6de0: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  <10 ){.      p->
6df0: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31 30  nMem = nMem = 10
6e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
6e10: 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Mem = sqlite3DbM
6e20: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
6e30: 20 20 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f        nMem*sizeo
6e40: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
6e50: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a       /* aMem */.
6e60: 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a        + nVar*siz
6e70: 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20  eof(Mem)        
6e80: 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a         /* aVar *
6e90: 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73  /.      + nArg*s
6ea0: 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20  izeof(Mem*)     
6eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72           /* apAr
6ec0: 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  g */.      + nVa
6ed0: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  r*sizeof(char*) 
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6ef0: 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  zVar */.      + 
6f00: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43  nCursor*sizeof(C
6f10: 75 72 73 6f 72 2a 29 20 2b 20 31 20 20 20 20 2f  ursor*) + 1    /
6f20: 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29  * apCsr */.    )
6f30: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
6f40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6f50: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20       p->aMem--; 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6f70: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
6f80: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20  1..nMem */.     
6f90: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
6fa0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
6fb0: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
6fc0: 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  m-1 */.      p->
6fd0: 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  aVar = &p->aMem[
6fe0: 6e 4d 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70  nMem+1];.      p
6ff0: 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20  ->nVar = nVar;. 
7000: 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20       p->okVar = 
7010: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  0;.      p->apAr
7020: 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61  g = (Mem**)&p->a
7030: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
7040: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61   p->azVar = (cha
7050: 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41  r**)&p->apArg[nA
7060: 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  rg];.      p->ap
7070: 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29  Csr = (Cursor**)
7080: 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b  &p->azVar[nVar];
7090: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  .      p->nCurso
70a0: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20  r = nCursor;.   
70b0: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
70c0: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
70d0: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
70e0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
70f0: 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e         p->aVar[n
7100: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
7110: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31   }.      for(n=1
7120: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
7130: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
7140: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
7150: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
7160: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
7170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7180: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
7190: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
71a0: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
71b0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
71c0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
71d0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
71e0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
71f0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
7200: 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43  OK;.  p->uniqueC
7210: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72  nt = 0;.  p->err
7220: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
7230: 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69  ort;.  p->explai
7240: 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a  n |= isExplain;.
7250: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
7260: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
7270: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
7280: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
7290: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
72a0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
72b0: 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74  .  p->openedStat
72c0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  ement = 0;.#ifde
72d0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
72e0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
72f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7300: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
7310: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
7320: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70   0;.      p->aOp
7330: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
7340: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
7360: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
7370: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
7380: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
7390: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
73a0: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
73b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
73c0: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
73d0: 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29  *p, Cursor *pCx)
73e0: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
73f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
7400: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  }.  if( pCx->pBt
7410: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
7420: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
7430: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
7440: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
7450: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
7460: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
7470: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
7480: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
7490: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
74a0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
74b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
74c0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
74d0: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
74e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
74f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7500: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
7510: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
7520: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
7530: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
7540: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
7550: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
7560: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
7570: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
7580: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
7590: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
75a0: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
75b0: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
75c0: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
75d0: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
75e0: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  r);.    (void)sq
75f0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
7600: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
7610: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
7620: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
7630: 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64  !pCx->ephemPseud
7640: 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  oTable ){.    sq
7650: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
7660: 62 2c 20 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a  b, pCx->pData);.
7670: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
7680: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  se all cursors e
7690: 78 63 65 70 74 20 66 6f 72 20 56 54 61 62 20 63  xcept for VTab c
76a0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
76b0: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20  currently.** in 
76c0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
76d0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
76e0: 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56  orsExceptActiveV
76f0: 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  tabs(Vdbe *p){. 
7700: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
7710: 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75  >apCsr==0 ) retu
7720: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
7730: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
7740: 29 7b 0a 20 20 20 20 43 75 72 73 6f 72 20 2a 70  ){.    Cursor *p
7750: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
7760: 0a 20 20 20 20 69 66 28 20 70 43 20 26 26 20 28  .    if( pC && (
7770: 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64  !p->inVtabMethod
7780: 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62 43 75   || !pC->pVtabCu
7790: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 73  rsor) ){.      s
77a0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
77b0: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
77c0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
77d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
77e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
77f0: 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65  the VM after exe
7800: 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cution..**.** Th
7810: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
7820: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
7830: 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c  ose any cursors,
7840: 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a   lists, and/or.*
7850: 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77  * sorters that w
7860: 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20  ere left open.  
7870: 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20  It also deletes 
7880: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a  the values of.**
7890: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
78a0: 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a  e aVar[] array..
78b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
78c0: 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 2c 20  leanup(Vdbe *p, 
78d0: 69 6e 74 20 66 72 65 65 62 75 66 66 65 72 73 29  int freebuffers)
78e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
78f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7900: 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
7910: 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56  orsExceptActiveV
7920: 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 69  tabs(p);.  for(i
7930: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
7940: 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74  i++){.    MemSet
7950: 54 79 70 65 46 6c 61 67 28 26 70 2d 3e 61 4d 65  TypeFlag(&p->aMe
7960: 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  m[i], MEM_Null);
7970: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
7980: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
7990: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 66 72 65  1], p->nMem, fre
79a0: 65 62 75 66 66 65 72 73 29 3b 0a 20 20 73 71 6c  ebuffers);.  sql
79b0: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
79c0: 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20  r(&p->sFifo);.  
79d0: 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  if( p->contextSt
79e0: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ack ){.    for(i
79f0: 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74  =0; i<p->context
7a00: 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a  StackTop; i++){.
7a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7a20: 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63  eFifoClear(&p->c
7a30: 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73  ontextStack[i].s
7a40: 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Fifo);.    }.   
7a50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7a60: 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  b, p->contextSta
7a70: 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ck);.  }.  p->co
7a80: 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ntextStack = 0;.
7a90: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
7aa0: 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  kDepth = 0;.  p-
7ab0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
7ac0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
7ad0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
7ae0: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
7af0: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
7b00: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
7b10: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
7b20: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
7b30: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
7b40: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
7b50: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
7b60: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
7b70: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
7b80: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
7b90: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
7ba0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
7bb0: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
7bc0: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
7bd0: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
7be0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
7bf0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
7c00: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
7c10: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
7c20: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
7c30: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
7c40: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
7c50: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
7c60: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
7c70: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
7c80: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
7c90: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
7ca0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
7cb0: 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20 20  OLNAME_N, 1);.  
7cc0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7cd0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
7ce0: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
7cf0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
7d00: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
7d10: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
7d20: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
7d30: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
7d40: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7d50: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
7d60: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
7d70: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
7d80: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
7d90: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
7da0: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
7db0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
7dc0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
7dd0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
7de0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
7df0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
7e00: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
7e10: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
7e20: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
7e30: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
7e40: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
7e50: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
7e60: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
7e70: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
7e80: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
7e90: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7ea0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
7eb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34  ..**.** If N==P4
7ec0: 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e  _STATIC  it mean
7ed0: 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20  s that zName is 
7ee0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
7ef0: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
7f00: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
7f10: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
7f20: 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74  e pointer. If it
7f30: 20 69 73 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20   is P4_DYNAMIC, 
7f40: 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72  then .** the str
7f50: 69 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69  ing is freed usi
7f60: 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
7f70: 28 64 62 2c 20 29 20 77 68 65 6e 20 74 68 65 20  (db, ) when the 
7f80: 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65 64  vdbe is finished
7f90: 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68   with.** it. Oth
7fa0: 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20  erwise, N bytes 
7fb0: 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70  of zName are cop
7fc0: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
7fd0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7fe0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
7ff0: 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e  dx, int var, con
8000: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
8010: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63  int N){.  int rc
8020: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
8030: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
8040: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
8050: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
8060: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
8070: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
8080: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
8090: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
80a0: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
80b0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
80c0: 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
80d0: 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e  Name[idx+var*p->
80e0: 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  nResColumn]);.  
80f0: 69 66 28 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49  if( N==P4_DYNAMI
8100: 43 20 7c 7c 20 4e 3d 3d 50 34 5f 53 54 41 54 49  C || N==P4_STATI
8110: 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  C ){.    rc = sq
8120: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
8130: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
8140: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
8150: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
8160: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
8170: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
8180: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
8190: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20  Name, zName, N, 
81a0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
81b0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
81c0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
81d0: 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34 5f  ITE_OK && N==P4_
81e0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70  DYNAMIC ){.    p
81f0: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26  ColName->flags &
8200: 3d 20 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 3b  = (~MEM_Static);
8210: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a  .    pColName->z
8220: 4d 61 6c 6c 6f 63 20 3d 20 70 43 6f 6c 4e 61 6d  Malloc = pColNam
8230: 65 2d 3e 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e->z;.  }.  retu
8240: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8250: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
8260: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
8270: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
8280: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
8290: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
82a0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
82b0: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
82c0: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
82d0: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
82e0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
82f0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
8300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
8310: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
8320: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
8330: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8340: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
8350: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
8360: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
8370: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
8380: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
8390: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
83a0: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
83b0: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
83c0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
83d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
83e0: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
83f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  = 0;..  /* Befor
8400: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
8410: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
8420: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
8430: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
8440: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
8450: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
8460: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
8470: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
8480: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
8490: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
84a0: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
84b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
84c0: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
84d0: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
84e0: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
84f0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
8500: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
8510: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
8520: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
8530: 61 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a  abSync(db, rc);.
8540: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8550: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
8560: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
8570: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
8580: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
8590: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
85a0: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
85b0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
85c0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
85d0: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
85e0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
85f0: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
8600: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
8610: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
8620: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
8630: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
8640: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
8650: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
8660: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
8670: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
8680: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
8690: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
86a0: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
86b0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
86c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
86d0: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
86e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
86f0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
8700: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
8710: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
8720: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
8730: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
8740: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
8750: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
8760: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
8770: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
8780: 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
8790: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
87a0: 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
87b0: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
87c0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
87d0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
87e0: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
87f0: 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
8800: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
8810: 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
8820: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
8830: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20  afetyOn(db);.   
8840: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8850: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8860: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
8870: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
8880: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
8890: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
88a0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
88b0: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
88c0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
88d0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
88e0: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
88f0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
8900: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
8910: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
8920: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
8930: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
8940: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
8950: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
8960: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
8970: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
8980: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
8990: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
89a0: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
89b0: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
89c0: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
89d0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
89e0: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
89f0: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
8a00: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
8a10: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
8a20: 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33  ==strlen(sqlite3
8a30: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
8a40: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
8a50: 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29  ) || nTrans<=1 )
8a60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
8a70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8a80: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8a90: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
8aa0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
8ab0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
8ac0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
8ad0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
8ae0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
8af0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
8b00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
8b10: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
8b20: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
8b30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
8b40: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
8b50: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
8b60: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
8b70: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
8b80: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
8b90: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
8ba0: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
8bb0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
8bc0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
8bd0: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
8be0: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
8bf0: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
8c00: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
8c10: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
8c20: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
8c30: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
8c40: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
8c50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
8c60: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
8c70: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8c80: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8c90: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
8ca0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
8cb0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
8cc0: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
8cd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ce0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8cf0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
8d00: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
8d10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8d20: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
8d30: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
8d40: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
8d50: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
8d60: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
8d70: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
8d80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
8d90: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
8da0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
8db0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
8dc0: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  cly..  */.#ifnde
8dd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
8de0: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
8df0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
8e00: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
8e10: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
8e20: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
8e30: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
8e40: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
8e50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8e60: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
8e70: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
8e80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8e90: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
8ea0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
8eb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
8ec0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
8ed0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
8ee0: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f   int res;..    /
8ef0: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
8f00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
8f10: 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a  ame */.    do {.
8f20: 20 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d        u32 random
8f30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
8f40: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
8f50: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
8f60: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
8f70: 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61  eof(random), &ra
8f80: 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61  ndom);.      zMa
8f90: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
8fa0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
8fb0: 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  %08X", zMainFile
8fc0: 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66 66  , random&0x7ffff
8fd0: 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fff);.      if( 
8fe0: 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !zMaster ){.    
8ff0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9000: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
9010: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9020: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
9030: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
9040: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
9050: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
9060: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
9070: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
9080: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9090: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
90a0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
90b0: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
90c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
90d0: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
90e0: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
90f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
9100: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
9110: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
9120: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
9130: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
9140: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
9150: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
9160: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
9170: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
9180: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9190: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
91a0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
91b0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
91c0: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
91d0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
91e0: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
91f0: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
9200: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
9210: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
9220: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
9230: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9240: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
9250: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
9260: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
9270: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9280: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
9290: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
92a0: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
92b0: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
92c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
92d0: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
92e0: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
92f0: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
9300: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
9310: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
9320: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9330: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9340: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9350: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9360: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
9370: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
9380: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
9390: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
93a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
93b0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
93c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
93d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
93e0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
93f0: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
9400: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
9410: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63   zFile[0]==0 ) c
9420: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
9430: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  ore :memory: dat
9440: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
9450: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
9460: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
9470: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
9480: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
9490: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
94a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
94b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
94c0: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
94d0: 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  e, strlen(zFile)
94e0: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
94f0: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
9500: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a  trlen(zFile)+1;.
9510: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9520: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
9540: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
9550: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
9560: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
9570: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
9580: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9590: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
95a0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
95b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
95c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
95d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
95e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
95f0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
9600: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
9610: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
9620: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
9630: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
9640: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
9650: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
9660: 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
9670: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
9680: 0a 20 20 20 20 69 66 28 20 28 6e 65 65 64 53 79  .    if( (needSy
9690: 6e 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d  nc .     && (0==
96a0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
96b0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
96c0: 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
96d0: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
96e0: 29 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73  )).     && (rc=s
96f0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
9700: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
9710: 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49  C_NORMAL))!=SQLI
9720: 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
9730: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
9740: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
9750: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
9760: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
9770: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
9780: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
9790: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
97a0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
97b0: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
97c0: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
97d0: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
97e0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
97f0: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
9800: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
9810: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
9820: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
9830: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
9840: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
9850: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
9860: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
9870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9880: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
9890: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
98a0: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
98b0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
98c0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
98d0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
98e0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
98f0: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
9900: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
9910: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
9920: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
9930: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
9940: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
9950: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
9960: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
9970: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
9980: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
9990: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
99a0: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
99b0: 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  occured..    */.
99c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
99d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
99e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
99f0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
9a00: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9a10: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
9a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9a30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
9a40: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
9a50: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
9a60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9a70: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
9a80: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  pMaster);.    if
9a90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9aa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9ab0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
9ac0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
9ad0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
9ae0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
9af0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9b00: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
9b10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9b20: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
9b30: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
9b40: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
9b50: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
9b60: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
9b70: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
9b80: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
9b90: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
9ba0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
9bb0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
9bc0: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
9bd0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
9be0: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
9bf0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
9c00: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
9c10: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
9c20: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
9c30: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
9c40: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
9c50: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
9c60: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
9c70: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
9c80: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9c90: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
9ca0: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
9cb0: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
9cc0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
9cd0: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
9ce0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
9cf0: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
9d00: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
9d10: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
9d20: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
9d30: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
9d40: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
9d50: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
9d60: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
9d70: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
9d80: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
9d90: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
9da0: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
9db0: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
9dc0: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
9dd0: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
9de0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
9df0: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
9e00: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
9e10: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
9e20: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
9e30: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
9e40: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
9e50: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
9e60: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
9e70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
9e80: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
9e90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
9eb0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
9ec0: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
9ed0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
9ee0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
9ef0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
9f00: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
9f10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
9f20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
9f30: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
9f40: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
9f50: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
9f60: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
9f70: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
9f80: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
9f90: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
9fa0: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
9fb0: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
9fc0: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
9fd0: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
9fe0: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
9ff0: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
a000: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
a010: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
a020: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
a030: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
a040: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
a050: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
a060: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
a070: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
a080: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
a090: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
a0a0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
a0b0: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
a0c0: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
a0d0: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
a0e0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
a0f0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
a100: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
a110: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
a120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
a130: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
a140: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
a150: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
a160: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
a170: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
a180: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
a190: 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  /*.** For every 
a1a0: 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61  Btree that in da
a1b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a1c0: 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68  n db which .** h
a1d0: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
a1e0: 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61  , "trip" or inva
a1f0: 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73  lidate each curs
a200: 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74  or in.** that Bt
a210: 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  ree might have b
a220: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
a230: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
a240: 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  ** can never be 
a250: 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69  used again.  Thi
a260: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
a270: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63   rollback.*** oc
a280: 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74  curs.  We have t
a290: 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f  o trip all the o
a2a0: 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76  ther cursors, ev
a2b0: 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f  en.** cursor fro
a2c0: 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64  m other VMs in d
a2d0: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
a2e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a  e connections,.*
a2f0: 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f  * so that none o
a300: 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73  f them try to us
a310: 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68  e the data at wh
a320: 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65  ich they.** were
a330: 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68   pointing and wh
a340: 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65  ich now may have
a350: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75   been changed du
a360: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c  e.** to the roll
a370: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65  back..**.** Reme
a380: 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c  mber that a roll
a390: 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20  back can delete 
a3a0: 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20  tables complete 
a3b0: 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72  and.** reorder r
a3c0: 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74  ootpages.  So it
a3d0: 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
a3e0: 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a  nt just to save.
a3f0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ** the state of 
a400: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20  the cursor.  We 
a410: 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61  have to invalida
a420: 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  te the cursor.**
a430: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
a440: 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e  ever used again.
a450: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a460: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
a470: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
a480: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
a490: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a4a0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
a4b0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
a4c0: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
a4d0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26  Bt;.    if( p &&
a4e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
a4f0: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
a500: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
a510: 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
a520: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a   SQLITE_ABORT);.
a530: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
a540: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a550: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
a560: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
a570: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
a580: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
a590: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
a5a0: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
a5b0: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
a5c0: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
a5d0: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
a5e0: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
a5f0: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
a600: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
a610: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
a620: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
a630: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
a640: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
a650: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
a660: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
a670: 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
a680: 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
a690: 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
a6a0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
a6b0: 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
a6c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
a6d0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
a6e0: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
a6f0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
a700: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
a710: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
a720: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
a730: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
a740: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
a750: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
a760: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
a770: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
a780: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
a790: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
a7a0: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  lt(Vdbe *p){.  s
a7b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
a7c0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
a7d0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65  nt (*xFunc)(Btre
a7e0: 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a  e *pBt) = 0;  /*
a7f0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
a800: 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20  l on each btree 
a810: 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  backend */.  int
a820: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
a830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a840: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51  et to true if SQ
a850: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f  LITE_NOMEM or IO
a860: 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ERR */..  /* Thi
a870: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
a880: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
a890: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
a8a0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
a8b0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
a8c0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
a8d0: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
a8e0: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
a8f0: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
a900: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
a910: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
a920: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
a930: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
a940: 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
a950: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
a960: 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
a970: 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
a980: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
a990: 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
a9a0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
a9b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
a9c0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
a9d0: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
a9e0: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
a9f0: 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
aa00: 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
aa10: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
aa20: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
aa30: 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
aa40: 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
aa50: 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
aa60: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
aa70: 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
aa80: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
aa90: 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
aaa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
aab0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
aac0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
aad0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
aae0: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
aaf0: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
ab00: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
ab10: 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
ab20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ab30: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
ab40: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
ab50: 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
ab60: 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
ab70: 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
ab80: 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  r started */.  i
ab90: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
aba0: 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
abb0: 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
abc0: 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
abd0: 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
abe0: 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
abf0: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
ac00: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
ac10: 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  reeMutexArrayEnt
ac20: 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  er(&p->aMutex);.
ac30: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
ac40: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
ac50: 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
ac60: 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
ac70: 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
ac80: 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
ac90: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
aca0: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
acb0: 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
acc0: 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
acd0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
ace0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
acf0: 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
ad00: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
ad10: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f        /* This lo
ad20: 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63 20 61  op does static a
ad30: 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 71  nalysis of the q
ad40: 75 65 72 79 20 74 6f 20 73 65 65 20 77 68 69 63  uery to see whic
ad50: 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  h of the.      *
ad60: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  * following thre
ad70: 65 20 63 61 74 65 67 6f 72 69 65 73 20 69 74 20  e categories it 
ad80: 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20  falls into:.    
ad90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
ada0: 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20    Read-only.    
adb0: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
adc0: 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  ith statement jo
add0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20  urnal.      **  
ade0: 20 20 20 51 75 65 72 79 20 77 69 74 68 6f 75 74     Query without
adf0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ae00: 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  al.      **.    
ae10: 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f    ** We could do
ae20: 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20   something more 
ae30: 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68 69  elegant than thi
ae40: 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  s static analysi
ae50: 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a  s (i.e..      **
ae60: 20 73 74 6f 72 65 20 74 68 65 20 74 79 70 65 20   store the type 
ae70: 6f 66 20 71 75 65 72 79 20 61 73 20 70 61 72 74  of query as part
ae80: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61 74   of the compliat
ae90: 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74 20  ion phase), but 
aea0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69  .      ** handli
aeb0: 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49  ng malloc() or I
aec0: 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61 20 66  O failure is a f
aed0: 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64  airly obscure ed
aee0: 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20 20 20  ge case so .    
aef0: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 72 6f    ** this is pro
af00: 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20 54 6f  bably easier. To
af10: 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61 6e 20  do: Might be an 
af20: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
af30: 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  educe .      ** 
af40: 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65 72 79  code size a very
af50: 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68   small amount th
af60: 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  ough....      */
af70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74 52 65  .      int notRe
af80: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
af90: 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e    int isStatemen
afa0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  t = 0;.      ass
afb0: 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d  ert(p->aOp || p-
afc0: 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20  >nOp==0);.      
afd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
afe0: 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  p; i++){ .      
aff0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70    switch( p->aOp
b000: 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  [i].opcode ){.  
b010: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
b020: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20  Transaction:.   
b030: 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61 64           notRead
b040: 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69  Only |= p->aOp[i
b050: 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ].p2;.          
b060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b070: 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61 74 65     case OP_State
b080: 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ment:.          
b090: 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20    isStatement = 
b0a0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
b0b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
b0c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20        }..   .   
b0d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
b0e0: 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
b0f0: 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20  , we need do no 
b100: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e  rollback at all.
b110: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
b120: 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74    ** proceed wit
b130: 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61  h the special ha
b140: 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  ndling..      */
b150: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74 52 65  .      if( notRe
b160: 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
b170: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
b180: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
b190: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc==SQLITE_IOE
b1a0: 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20 69 73  RR_BLOCKED && is
b1b0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
b1c0: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
b1d0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b1e0: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  ackStmt;.       
b1f0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
b200: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
b210: 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72 63 3d  } else if( (mrc=
b220: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
b230: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
b240: 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e  L) && isStatemen
b250: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  t ){.          x
b260: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
b270: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b  reeRollbackStmt;
b280: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
b2a0: 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
b2b0: 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
b2c0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
b2d0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
b2e0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
b2f0: 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
b300: 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
b310: 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
b320: 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
b330: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b340: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
b350: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
b360: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
b370: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
b380: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
b390: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
b3a0: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
b3b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b3c0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b3d0: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
b3e0: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
b3f0: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
b400: 63 74 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e  ctive vdbe, then
b410: 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69  .    ** we do ei
b420: 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
b430: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
b440: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
b450: 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
b460: 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
b470: 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
b480: 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
b490: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
b4a0: 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
b4b0: 76 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20  ve has occured. 
b4c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b4d0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26  db->autoCommit &
b4e0: 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  & db->activeVdbe
b4f0: 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Cnt==1 ){.      
b500: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b510: 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
b520: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
b530: 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
b540: 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
b550: 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
b560: 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
b570: 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72   and the vdbe pr
b580: 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20  ogram was .     
b590: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
b5a0: 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
b5b0: 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e  AIL' constraint.
b5c0: 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
b5d0: 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  mmit .        **
b5e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
b5f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b600: 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f   int rc = vdbeCo
b610: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  mmit(db);.      
b620: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b630: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
b640: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
b650: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
b660: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
b670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b680: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
b690: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
b6a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b6b0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
b6c0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
b6d0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
b6e0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  db);.        }el
b6f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
b700: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
b710: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
b720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b740: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
b750: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
b760: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46     }else if( !xF
b770: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  unc ){.      if(
b780: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b790: 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
b7a0: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
b7b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
b7c0: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29  penedStatement )
b7d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b7e0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b7f0: 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20  CommitStmt;.    
b800: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
b810: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
b820: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
b830: 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63  ){.        xFunc
b840: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
b850: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
b860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b870: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
b880: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
b890: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
b8a0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
b8b0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
b8c0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
b8d0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b8e0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
b8f0: 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  xFunc is not NUL
b900: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e  L, then it is on
b910: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
b920: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72  eRollbackStmt or
b930: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
b940: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20  treeCommitStmt. 
b950: 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20  Call it once on 
b960: 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66  each backend. If
b970: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b980: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
b990: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
b9a0: 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  till SQLITE_OK, 
b9b0: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
b9c0: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ode to the new. 
b9d0: 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75     ** error valu
b9e0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
b9f0: 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20  sert(!xFunc ||. 
ba00: 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69       xFunc==sqli
ba10: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
ba20: 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e  mt ||.      xFun
ba30: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52  c==sqlite3BtreeR
ba40: 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20  ollbackStmt.    
ba50: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
ba60: 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e  xFunc && i<db->n
ba70: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
ba80: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42   int rc;.      B
ba90: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
baa0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
bab0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
bac0: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28       rc = xFunc(
bad0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
bae0: 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d  ( rc && (p->rc==
baf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
bb00: 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
bb10: 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20  RAINT) ){.      
bb20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
bb30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bb40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
bb50: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
bb60: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
bb70: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
bb80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
bb90: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
bba0: 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
bbb0: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
bbc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   the statement w
bbd0: 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20  as committed, . 
bbe0: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68     ** set the ch
bbf0: 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20  ange counter. . 
bc00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
bc10: 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20  >changeCntOn && 
bc20: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
bc30: 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20    if( !xFunc || 
bc40: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
bc50: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b  reeCommitStmt ){
bc60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bc70: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
bc80: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
bc90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bcb0: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
bcc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bcd0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
bce0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
bcf0: 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
bd00: 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
bd10: 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
bd20: 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
bd30: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
bd40: 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
bd50: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
bd60: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
bd70: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
bd80: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
bd90: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
bda0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
bdb0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
bdc0: 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
bdd0: 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
bde0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
bdf0: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
be00: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
be10: 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tex);.  }..  /* 
be20: 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
be30: 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
be40: 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
be50: 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
be60: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
be70: 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
be80: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
be90: 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
bea0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
beb0: 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
bec0: 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
bed0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
bee0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
bef0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
bf00: 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  M;.  }..  return
bf10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
bf20: 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
bf30: 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
bf40: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
bf50: 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
bf60: 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
bf70: 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
bf80: 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
bf90: 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
bfa0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
bfb0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
bfc0: 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
bfd0: 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
bfe0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bff0: 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
c000: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
c010: 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
c020: 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
c030: 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
c040: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
c050: 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
c060: 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
c070: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
c080: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
c090: 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
c0a0: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
c0b0: 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
c0c0: 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
c0d0: 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
c0e0: 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
c0f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
c100: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
c110: 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
c120: 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
c130: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
c140: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
c150: 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
c160: 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
c170: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
c180: 65 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  et(Vdbe *p, int 
c190: 66 72 65 65 62 75 66 66 65 72 73 29 7b 0a 20 20  freebuffers){.  
c1a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
c1b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
c1c0: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
c1d0: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
c1e0: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
c1f0: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
c200: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
c210: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
c220: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
c230: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
c240: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
c250: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
c260: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
c270: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
c280: 70 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  p);.  (void)sqli
c290: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
c2a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
c2b0: 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
c2c0: 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
c2d0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
c2e0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
c2f0: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
c300: 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
c310: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
c320: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
c330: 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
c340: 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
c350: 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
c360: 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
c370: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
c380: 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
c390: 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
c3a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
c3b0: 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
c3c0: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
c3d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
c3e0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
c3f0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
c400: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
c410: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d  etStr(db->pErr,-
c420: 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c  1,p->zErrMsg,SQL
c430: 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f  ITE_UTF8,SQLITE_
c440: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
c450: 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
c460: 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  p->rc;.      sql
c470: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c480: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
c490: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
c4a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c4b0: 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73  p->rc ){.      s
c4c0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c4d0: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d  p->rc, 0);.    }
c4e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
c4f0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
c500: 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20  ITE_OK, 0);.    
c510: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  }.  }else if( p-
c520: 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
c530: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
c540: 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
c550: 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
c560: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
c570: 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
c580: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
c590: 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
c5a0: 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
c5b0: 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
c5c0: 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
c5d0: 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
c5e0: 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
c5f0: 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
c600: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
c610: 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
c620: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
c630: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
c640: 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
c650: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
c660: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
c670: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c680: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
c690: 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
c6a0: 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
c6b0: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
c6c0: 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
c6d0: 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
c6e0: 6e 75 70 28 70 2c 20 66 72 65 65 62 75 66 66 65  nup(p, freebuffe
c6f0: 72 73 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  rs);..  /* Save 
c700: 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
c710: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
c720: 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
c730: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
c740: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
c750: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
c760: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
c770: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
c780: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
c790: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
c7a0: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
c7b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c7c0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
c7d0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
c7e0: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
c7f0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
c800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
c810: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
c820: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c830: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
c840: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c850: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
c860: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
c870: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
c880: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
c890: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
c8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
c8b0: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
c8c0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
c8d0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
c8e0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
c900: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
c910: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
c920: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
c930: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
c940: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
c950: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
c960: 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74  INIT;.  p->abort
c970: 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ed = 0;.  return
c980: 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
c990: 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
c9a0: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
c9b0: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
c9c0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
c9d0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
c9e0: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
c9f0: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
ca00: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
ca10: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
ca20: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
ca30: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
ca40: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
ca50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ca60: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
ca70: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
ca80: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
ca90: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
caa0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
cab0: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 2c  ite3VdbeReset(p,
cac0: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
cad0: 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
cae0: 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
caf0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67  }else if( p->mag
cb00: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
cb10: 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  NIT ){.    retur
cb20: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
cb30: 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 6c 65 61 73  .  }.  /* releas
cb40: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
cb50: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20  em[1], p->nMem, 
cb60: 31 29 3b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  1); */.  sqlite3
cb70: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
cb80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cb90: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
cba0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
cbb0: 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
cbc0: 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
cbd0: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
cbe0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
cbf0: 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
cc00: 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
cc10: 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
cc20: 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
cc30: 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
cc40: 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
cc50: 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
cc60: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
cc70: 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
cc80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
cc90: 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
cca0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
ccb0: 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
ccc0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ccd0: 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
cce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
ccf0: 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
cd00: 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
cd10: 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
cd20: 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
cd30: 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75  &(1<<i))) && pAu
cd40: 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
cd50: 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
cd60: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
cd70: 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
cd80: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
cd90: 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
cda0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
cdb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
cdc0: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
cdd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cde0: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
cdf0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
ce00: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
ce10: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ce20: 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
ce30: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
ce40: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
ce50: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
ce60: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
ce70: 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
ce80: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
ce90: 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
cea0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
ceb0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
cec0: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
ced0: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
cee0: 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  ( p->aOp ){.    
cef0: 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *pOp = p->aOp
cf00: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
cf10: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f  <p->nOp; i++, pO
cf20: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65  p++){.      free
cf30: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
cf40: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
cf50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
cf60: 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65  BUG.      sqlite
cf70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
cf80: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
cf90: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
cfa0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
cfb0: 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d  db, p->aOp);.  }
cfc0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
cfd0: 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
cfe0: 56 61 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  Var, 1);.  sqlit
cff0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d000: 61 4c 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70  aLabel);.  if( p
d010: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  ->aMem ){.    sq
d020: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d030: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20  &p->aMem[1]);.  
d040: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
d050: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
d060: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
d070: 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20 20  OLNAME_N, 1);.  
d080: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d090: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
d0a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d0b0: 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
d0c0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
d0d0: 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71  MAGIC_DEAD;.  sq
d0e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d0f0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  p);.}../*.** If 
d100: 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
d110: 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
d120: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
d130: 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
d140: 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
d150: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
d160: 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76  code.  If no Mov
d170: 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  eTo is pending, 
d180: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
d190: 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64  does nothing and
d1a0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
d1b0: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
d1c0: 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
d1d0: 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  to(Cursor *p){. 
d1e0: 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
d1f0: 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
d200: 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
d210: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
d220: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
d230: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
d240: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  t;.#endif.    as
d250: 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
d260: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
d270: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
d280: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 30  p->pCursor, 0, 0
d290: 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
d2a0: 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
d2b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d2c0: 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e   rc;.    *p->pIn
d2d0: 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  crKey = 0;.    p
d2e0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65  ->lastRowid = ke
d2f0: 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f  yToInt(p->moveto
d300: 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e  Target);.    p->
d310: 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72  rowidIsValid = r
d320: 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72  es==0;.    if( r
d330: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  es<0 ){.      rc
d340: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
d350: 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
d360: 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
d370: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d380: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
d390: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
d3a0: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
d3b0: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
d3c0: 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
d3d0: 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63  to = 0;.    p->c
d3e0: 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
d3f0: 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73  HE_STALE;.  }els
d400: 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72  e if( p->pCursor
d410: 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d   ){.    int hasM
d420: 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  oved;.    int rc
d430: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d440: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
d450: 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f  >pCursor, &hasMo
d460: 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ved);.    if( rc
d470: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d480: 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29    if( hasMoved )
d490: 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65  {.      p->cache
d4a0: 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
d4b0: 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  TALE;.      p->n
d4c0: 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ullRow = 1;.    
d4d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
d4e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d4f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d500: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
d510: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
d520: 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
d530: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d540: 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
d550: 65 33 56 64 62 65 53 65 72 69 61 6c 52 65 61 64  e3VdbeSerialRead
d560: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d570: 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
d580: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d590: 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65  lWrite().**.** e
d5a0: 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
d5b0: 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
d5c0: 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
d5d0: 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
d5e0: 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
d5f0: 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
d600: 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
d610: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
d620: 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
d630: 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
d640: 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
d650: 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
d660: 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
d670: 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
d680: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
d690: 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
d6a0: 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
d6b0: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
d6c0: 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
d6d0: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
d6e0: 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
d6f0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
d700: 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
d710: 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
d720: 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
d730: 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
d740: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
d750: 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
d760: 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
d770: 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
d780: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
d790: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
d7a0: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
d7b0: 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
d7c0: 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c  a blob seperatel
d7d0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
d7e0: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
d7f0: 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
d800: 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
d810: 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
d820: 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
d830: 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
d840: 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
d850: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
d860: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
d870: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
d880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
d890: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d8a0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
d8b0: 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
d8c0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
d8d0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
d8e0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
d8f0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
d920: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
d930: 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
d950: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
d960: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
d970: 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
d980: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
d990: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
d9a0: 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
d9d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
d9e0: 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
d9f0: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
da00: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
da10: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
da40: 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
da50: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
da60: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
da70: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
da80: 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
da90: 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
daa0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
dab0: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
dac0: 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
dad0: 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
db00: 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
db10: 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
db20: 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
db30: 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
db40: 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
db50: 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
db60: 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
db70: 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
db80: 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
db90: 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
dba0: 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
dbb0: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
dbc0: 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
dbd0: 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
dbe0: 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
dbf0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
dc00: 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
dc10: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
dc20: 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
dc30: 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
dc40: 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
dc50: 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
dc60: 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  at){.  int flags
dc70: 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
dc80: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20    int n;..  if( 
dc90: 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
dca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
dcb0: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
dcc0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
dcd0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
dce0: 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
dcf0: 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
dd00: 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
dd10: 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
dd20: 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
dd30: 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
dd40: 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
dd50: 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
dd60: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
dd70: 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20  && (i&1)==i ){. 
dd80: 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 69 3b       return 8+i;
dd90: 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69  .    }.    u = i
dda0: 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20  <0 ? -i : i;.   
ddb0: 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65   if( u<=127 ) re
ddc0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
ddd0: 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
dde0: 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
ddf0: 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
de00: 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
de10: 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
de20: 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
de30: 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
de40: 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
de50: 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
de60: 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
de70: 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
de80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61   }.  assert( fla
de90: 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
dea0: 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70  Blob) );.  n = p
deb0: 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
dec0: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
ded0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
dee0: 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >u.i;.  }.  asse
def0: 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65  rt( n>=0 );.  re
df00: 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
df10: 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
df20: 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
df30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
df40: 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
df50: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
df60: 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
df70: 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69  erial-type..*/.i
df80: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
df90: 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
dfa0: 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
dfb0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
dfc0: 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
dfd0: 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
dfe0: 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
dff0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e000: 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
e010: 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
e020: 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
e030: 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
e040: 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
e050: 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
e060: 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
e070: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
e080: 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
e090: 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
e0a0: 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
e0b0: 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
e0c0: 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
e0d0: 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
e0e0: 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
e0f0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
e100: 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
e110: 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
e120: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
e130: 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
e140: 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
e150: 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
e160: 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
e170: 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
e180: 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
e190: 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
e1a0: 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
e1b0: 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
e1c0: 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
e1d0: 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
e1e0: 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
e1f0: 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
e200: 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
e210: 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
e220: 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
e230: 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
e240: 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
e250: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
e260: 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
e270: 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
e280: 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
e290: 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
e2a0: 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
e2b0: 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
e2c0: 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
e2d0: 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
e2e0: 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
e2f0: 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
e300: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
e310: 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
e320: 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
e330: 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
e340: 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
e350: 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
e360: 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
e370: 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
e380: 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
e390: 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
e3a0: 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
e3b0: 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
e3c0: 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
e3d0: 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
e3e0: 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
e3f0: 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
e400: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
e410: 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
e420: 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
e430: 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
e440: 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
e450: 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
e460: 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
e470: 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
e480: 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
e490: 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
e4a0: 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
e4b0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
e4c0: 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
e4d0: 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
e4e0: 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
e4f0: 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
e500: 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
e510: 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
e520: 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
e530: 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
e540: 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
e550: 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
e560: 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
e570: 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
e580: 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
e590: 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
e5a0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
e5b0: 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
e5c0: 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
e5d0: 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
e5e0: 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
e5f0: 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
e600: 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
e610: 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
e620: 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
e630: 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
e640: 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
e650: 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
e660: 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
e670: 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
e680: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
e690: 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
e6a0: 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
e6b0: 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
e6c0: 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
e6d0: 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
e6e0: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
e6f0: 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
e700: 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
e710: 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
e720: 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
e730: 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
e740: 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
e750: 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
e760: 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
e770: 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
e780: 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
e790: 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
e7a0: 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
e7b0: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
e7c0: 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
e7d0: 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
e7e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
e7f0: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
e800: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
e810: 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
e820: 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
e830: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
e840: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
e850: 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
e860: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
e870: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
e880: 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
e890: 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
e8a0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
e8b0: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
e8c0: 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
e8d0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
e8e0: 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
e8f0: 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77  .  nBuf must alw
e900: 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20  ays be.** large 
e910: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
e920: 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e  he entire field.
e930: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
e940: 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62   field is.** a b
e950: 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d  lob with a zero-
e960: 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65  filled tail, the
e970: 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65  n buf[] might be
e980: 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a   just the right.
e990: 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20  ** size to hold 
e9a0: 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70  everything excep
e9b0: 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66  t for the zero-f
e9c0: 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20  illed tail.  If 
e9d0: 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79  buf[].** is only
e9e0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
e9f0: 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f  old the non-zero
ea00: 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e   prefix, then on
ea10: 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  ly write that.**
ea20: 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66   prefix into buf
ea30: 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b  [].  But if buf[
ea40: 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  ] is large enoug
ea50: 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74  h to hold both t
ea60: 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64  he.** prefix and
ea70: 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77   the tail then w
ea80: 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20  rite the prefix 
ea90: 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c  and set the tail
eaa0: 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73   to all.** zeros
eab0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
eac0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
ead0: 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
eae0: 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
eaf0: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
eb00: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
eb10: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
eb20: 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
eb30: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
eb40: 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
eb50: 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
eb60: 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
eb70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
eb80: 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
eb90: 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d  f, int nBuf, Mem
eba0: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
ebb0: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20  _format){.  u32 
ebc0: 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71  serial_type = sq
ebd0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
ebe0: 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66  ype(pMem, file_f
ebf0: 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65  ormat);.  int le
ec00: 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
ec10: 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
ec20: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
ec30: 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
ec40: 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
ec50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ec60: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
ec70: 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
ec80: 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
ec90: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29  izeof(pMem->r) )
eca0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
ecb0: 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a  v, &pMem->r, siz
ecc0: 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
ecd0: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
ece0: 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
ecf0: 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
ed00: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
ed10: 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
ed20: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
ed30: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
ed40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  );.    assert( l
ed50: 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  en<=nBuf );.    
ed60: 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
ed70: 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26      buf[i] = (v&
ed80: 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
ed90: 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >= 8;.    }.    
eda0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
edb0: 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
edc0: 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
edd0: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
ede0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
edf0: 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
ee00: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
ee10: 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20  ?pMem->u.i:0).  
ee20: 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73 71             == sq
ee30: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
ee40: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
ee50: 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pe) );.    asser
ee60: 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66  t( pMem->n<=nBuf
ee70: 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
ee80: 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
ee90: 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
eea0: 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  len);.    if( pM
eeb0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
eec0: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65  Zero ){.      le
eed0: 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a  n += pMem->u.i;.
eee0: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42        if( len>nB
eef0: 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  uf ){.        le
ef00: 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20 20  n = nBuf;.      
ef10: 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  }.      memset(&
ef20: 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c  buf[pMem->n], 0,
ef30: 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20   len-pMem->n);. 
ef40: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
ef50: 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
ef60: 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
ef70: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
ef80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
ef90: 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
efa0: 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
efb0: 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
efc0: 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
efd0: 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
efe0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
eff0: 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
f000: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
f010: 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e  tes read..*/ .in
f020: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
f030: 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
f040: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
f050: 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
f060: 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
f070: 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
f080: 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
f090: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
f0a0: 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
f0b0: 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
f0c0: 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
f0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
f0e0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
f0f0: 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
f100: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
f110: 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
f120: 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
f130: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
f140: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
f150: 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
f160: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
f170: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
f180: 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
f190: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f1a0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
f1b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f1c0: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
f1d0: 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
f1e0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
f1f0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69   pMem->u.i = (si
f200: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
f210: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
f220: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
f230: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
f240: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
f250: 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
f260: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
f270: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
f280: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
f290: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
f2a0: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[1];.      pMem
f2b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f2c0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
f2d0: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
f2e0: 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
f2f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
f300: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
f310: 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
f320: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29  har)buf[0])<<16)
f330: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c   | (buf[1]<<8) |
f340: 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70   buf[2];.      p
f350: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f360: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f370: 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
f380: 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
f390: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f3a0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
f3b0: 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c  ->u.i = (buf[0]<
f3c0: 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
f3d0: 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
f3e0: 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
f3f0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f400: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
f410: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
f420: 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
f430: 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
f440: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  teger */.      u
f450: 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64  64 x = (((signed
f460: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
f470: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
f480: 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32    u32 y = (buf[2
f490: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d  ]<<24) | (buf[3]
f4a0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c  <<16) | (buf[4]<
f4b0: 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20  <8) | buf[5];.  
f4c0: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
f4d0: 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  | y;.      pMem-
f4e0: 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
f4f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
f500: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
f510: 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
f520: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
f530: 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
f540: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
f550: 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
f560: 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
f570: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  int */.      u64
f580: 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b   x;.      u32 y;
f590: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
f5a0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
f5b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
f5c0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
f5d0: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
f5e0: 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
f5f0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
f600: 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
f610: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
f620: 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
f630: 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
f640: 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
f650: 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a  LOAT is.      **
f660: 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
f670: 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
f680: 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
f690: 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
f6a0: 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
f6b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
f6c0: 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
f6d0: 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
f6e0: 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73  00)<<32;.      s
f6f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
f700: 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
f710: 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
f720: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
f730: 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
f740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
f750: 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
f760: 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
f770: 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
f780: 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
f790: 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
f7a0: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
f7b0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
f7c0: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
f7d0: 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
f7e0: 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
f7f0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
f800: 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
f810: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
f820: 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
f830: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
f840: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
f850: 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
f860: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
f870: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f880: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f890: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
f8a0: 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
f8b0: 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20  eof(pMem->r)==8 
f8c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d  );.        swapM
f8d0: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
f8e0: 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  x);.        memc
f8f0: 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c  py(&pMem->r, &x,
f900: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
f910: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f920: 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
f930: 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e  pMem->r) ? MEM_N
f940: 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
f950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
f960: 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
f970: 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
f980: 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
f990: 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
f9a0: 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
f9b0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
f9c0: 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
f9d0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f9e0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f9f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
fa00: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
fa10: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28       int len = (
fa20: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
fa30: 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
fa40: 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
fa50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
fa60: 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
fa70: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
fa80: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
fa90: 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
faa0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
fab0: 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
fac0: 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
fad0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
fae0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
faf0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
fb00: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
fb10: 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
fb20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
fb30: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
fb40: 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
fb50: 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
fb60: 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65  in pKey[], parse
fb70: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69   the.** record i
fb80: 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65  nto a UnpackedRe
fb90: 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e 20  cord structure. 
fba0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
fbb0: 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72  r to.** that str
fbc0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
fbd0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
fbe0: 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65  on might provide
fbf0: 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f   szSpace bytes o
fc00: 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  f memory.** spac
fc10: 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54 68  e at pSpace.  Th
fc20: 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  is space can be 
fc30: 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  used to hold the
fc40: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62   returned.** VDb
fc50: 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74  eParsedRecord st
fc60: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69 73  ructure if it is
fc70: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20   large enough.  
fc80: 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  If it is.** not 
fc90: 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63  big enough, spac
fca0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
fcb0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
fcc0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  c()..**.** The r
fcd0: 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75 72  eturned structur
fce0: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
fcf0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ed by a call to.
fd00: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  ** sqlite3VdbeDe
fd10: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
fd20: 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b  rd()..*/ .Unpack
fd30: 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
fd40: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
fd50: 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
fd60: 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
fd70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
fd80: 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
fd90: 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
fda0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
fdb0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
fdc0: 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
fdd0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
fde0: 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
fdf0: 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
fe00: 20 20 76 6f 69 64 20 2a 70 53 70 61 63 65 2c 20    void *pSpace, 
fe10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
fe20: 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68  e available to h
fe30: 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20 6f 62  old resulting ob
fe40: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ject */.  int sz
fe50: 53 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20  Space           
fe60: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
fe70: 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
fe80: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
fe90: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
fea0: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
feb0: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
fec0: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
fed0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  *p;.  int nByte;
fee0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 64 3b 0a 20  .  int idx, d;. 
fef0: 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
ff00: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
ff10: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
ff20: 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
ff30: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
ff40: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
ff50: 66 28 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a 70  f(Mem)>sizeof(*p
ff60: 29 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  ) );.  nByte = s
ff70: 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
ff80: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29 3b  Info->nField+2);
ff90: 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
ffa0: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20  pace ){.    p = 
ffb0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
ffc0: 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
ffd0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
ffe0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
fff0: 3b 0a 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65  ;.    p->needFre
10000 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
10010 20 20 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a      p = pSpace;.
10020 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20      p->needFree 
10030 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  = 0;.  }.  p->pK
10040 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
10050 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
10060 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
10070 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 6e 65 65 64  d + 1;.  p->need
10080 44 65 73 74 72 6f 79 20 3d 20 31 3b 0a 20 20 70  Destroy = 1;.  p
10090 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20  ->aMem = pMem = 
100a0 26 28 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b 0a 20  &((Mem*)p)[1];. 
100b0 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
100c0 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
100d0 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
100e0 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
100f0 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70  idx<szHdr && u<p
10100 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
10110 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
10120 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
10130 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 2b 69  Varint32( aKey+i
10140 64 78 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  dx, serial_type)
10150 3b 0a 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65  ;.    if( d>=nKe
10160 79 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  y && sqlite3Vdbe
10170 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
10180 72 69 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62  rial_type)>0 ) b
10190 72 65 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  reak;.    pMem->
101a0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
101b0 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
101c0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
101d0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
101e0 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  s = 0;.    pMem-
101f0 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
10200 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
10210 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
10220 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
10230 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
10240 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
10250 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d   }.  p->nField =
10260 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   u;.  return (vo
10270 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id*)p;.}../*.** 
10280 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73  This routine des
10290 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64  troys a Unpacked
102a0 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f  Record object.*/
102b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
102c0 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
102d0 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65  ecord(UnpackedRe
102e0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
102f0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
10300 6e 65 65 64 44 65 73 74 72 6f 79 20 29 7b 0a 20  needDestroy ){. 
10310 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
10320 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20    Mem *pMem;.   
10330 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d     for(i=0, pMem
10340 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
10350 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
10360 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10370 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
10380 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10390 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
103a0 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  e(pMem);.       
103b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
103c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64  .    if( p->need
103d0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Free ){.      sq
103e0 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
103f0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
10400 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10410 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10420 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
10430 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
10440 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
10450 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
10460 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
10470 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
10480 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
10490 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
104a0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
104b0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
104c0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
104d0 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
104e0 65 61 74 65 72 20 74 68 61 6e 20 70 50 4b 65 79  eater than pPKey
104f0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
10500 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
10510 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
10520 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61  ated by th OP_Ma
10530 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
10540 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
10550 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
10560 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
10570 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
10580 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
10590 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
105a0 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  cord..**.** Key1
105b0 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
105c0 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
105d0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
105e0 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 42   of fields..** B
105f0 75 74 20 69 66 20 74 68 65 20 6c 65 6e 67 74 68  ut if the length
10600 73 20 64 69 66 66 65 72 2c 20 4b 65 79 32 20 6d  s differ, Key2 m
10610 75 73 74 20 62 65 20 74 68 65 20 73 68 6f 72 74  ust be the short
10620 65 72 20 6f 66 20 74 68 65 20 74 77 6f 2e 0a 2a  er of the two..*
10630 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20  *.** Historical 
10640 6e 6f 74 65 3a 20 49 6e 20 65 61 72 6c 69 65 72  note: In earlier
10650 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
10660 73 20 72 6f 75 74 69 6e 65 20 62 6f 74 68 20 4b  s routine both K
10670 65 79 31 0a 2a 2a 20 61 6e 64 20 4b 65 79 32 20  ey1.** and Key2 
10680 77 65 72 65 20 62 6c 6f 62 73 20 6f 62 74 61 69  were blobs obtai
10690 6e 65 64 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65  ned from OP_Make
106a0 52 65 63 6f 72 64 2e 20 20 42 75 74 20 77 65 20  Record.  But we 
106b0 66 6f 75 6e 64 0a 2a 2a 20 74 68 61 74 20 69 6e  found.** that in
106c0 20 74 79 70 69 63 61 6c 20 75 73 65 20 74 68 65   typical use the
106d0 20 73 61 6d 65 20 4b 65 79 32 20 77 6f 75 6c 64   same Key2 would
106e0 20 62 65 20 73 75 62 6d 69 74 74 65 64 20 6d 75   be submitted mu
106f0 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 2a 2a 20  ltiple times.** 
10700 69 6e 20 61 20 72 6f 77 2e 20 20 53 6f 20 61 6e  in a row.  So an
10710 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
10720 73 20 61 64 64 65 64 20 74 6f 20 70 61 72 73 65  s added to parse
10730 20 74 68 65 20 4b 65 79 32 20 6b 65 79 0a 2a 2a   the Key2 key.**
10740 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20   separately and 
10750 73 75 62 6d 69 74 20 74 68 65 20 70 61 72 73 65  submit the parse
10760 64 20 76 65 72 73 69 6f 6e 2e 20 20 49 6e 20 74  d version.  In t
10770 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
10780 64 0a 2a 2a 20 70 61 72 73 69 6e 67 20 74 68 65  d.** parsing the
10790 20 73 61 6d 65 20 4b 65 79 32 20 6d 75 6c 74 69   same Key2 multi
107a0 70 6c 65 20 74 69 6d 65 73 20 69 6e 20 61 20 72  ple times in a r
107b0 6f 77 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ow..*/.int sqlit
107c0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
107d0 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
107e0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
107f0 65 79 31 2c 20 0a 20 20 55 6e 70 61 63 6b 65 64  ey1, .  Unpacked
10800 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 0a 29  Record *pPKey2.)
10810 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
10820 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10830 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
10840 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
10850 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
10860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
10870 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
10880 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
10890 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
108a0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
108b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
108c0 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
108d0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
108e0 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
108f0 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
10900 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
10910 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
10920 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
10930 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
10940 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
10950 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
10960 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
10970 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
10980 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
10990 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
109a0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65  eyInfo->db;.  me
109b0 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m1.flags = 0;.  
109c0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  mem1.zMalloc = 0
109d0 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  ;.  .  idx1 = ge
109e0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
109f0 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
10a00 20 73 7a 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c   szHdr1;.  nFiel
10a10 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
10a20 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
10a30 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
10a40 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
10a50 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
10a60 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
10a70 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
10a80 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
10a90 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
10aa0 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
10ab0 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
10ac0 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
10ad0 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
10ae0 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
10af0 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
10b00 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
10b10 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
10b20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45  break;..    /* E
10b30 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
10b40 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
10b50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
10b60 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
10b70 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
10b80 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
10b90 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
10ba0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
10bb0 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
10bc0 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
10bd0 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
10be0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20  Key2->aMem[i],. 
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65            i<nFie
10c10 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ld ? pKeyInfo->a
10c20 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
10c30 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
10c40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10c50 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  }.    i++;.  }. 
10c60 20 69 66 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f   if( mem1.zMallo
10c70 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
10c80 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
10c90 3b 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  ;..  /* One of t
10ca0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
10cb0 6f 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61  of fields, but a
10cc0 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
10cd0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20   to that point. 
10ce0 20 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20   ** were equal. 
10cf0 49 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66  If the incrKey f
10d00 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
10d10 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79  n the second key
10d20 20 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64   is.  ** treated
10d30 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f   as larger..  */
10d40 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
10d50 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
10d60 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20  ->incrKey ){.   
10d70 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
10d80 7d 65 6c 73 65 20 69 66 28 20 21 70 4b 65 79 49  }else if( !pKeyI
10d90 6e 66 6f 2d 3e 70 72 65 66 69 78 49 73 45 71 75  nfo->prefixIsEqu
10da0 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
10db0 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  d1<nKey1 ){.    
10dc0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
10dd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
10de0 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
10df0 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c  aSortOrder && i<
10e00 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
10e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
10e30 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
10e40 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a    rc = -rc;.  }.
10e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10e60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
10e70 65 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ent is an index 
10e80 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75  entry composed u
10e90 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
10ea0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
10eb0 2a 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79  * The last entry
10ec0 20 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20   in this record 
10ed0 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
10ee0 65 67 65 72 20 28 73 70 65 63 69 66 69 63 61 6c  eger (specifical
10ef0 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
10f00 20 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72   rowid).  This r
10f10 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
10f20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
10f30 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e  es in.** that in
10f40 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
10f50 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
10f60 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61  dLen(const u8 *a
10f70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 69  Key, int nKey, i
10f80 6e 74 20 2a 70 52 6f 77 69 64 4c 65 6e 29 7b 0a  nt *pRowidLen){.
10f90 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
10fa0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10fb0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
10fc0 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
10fd0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
10fe0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
10ff0 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
11000 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
11010 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 3e 6e  );.  if( szHdr>n
11020 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
11030 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11040 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 28 76 6f  _BKPT;.  }.  (vo
11050 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 26  id)getVarint32(&
11060 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  aKey[szHdr-1], t
11070 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 2a 70 52  ypeRowid);.  *pR
11080 6f 77 69 64 4c 65 6e 20 3d 20 73 71 6c 69 74 65  owidLen = sqlite
11090 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
110a0 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  en(typeRowid);. 
110b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
110c0 4b 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  K;.}.  ../*.** p
110d0 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
110e0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
110f0 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
11100 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
11110 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
11120 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
11130 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
11140 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
11150 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
11160 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
11170 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
11180 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
11190 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
111a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
111b0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
111c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
111d0 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
111e0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
111f0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
11200 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
11210 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
11220 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
11230 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
11240 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
11250 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
11260 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
11270 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
11280 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
11290 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
112a0 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
112b0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
112c0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
112d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
112e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
112f0 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30   }.  m.flags = 0
11300 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20  ;.  m.db = 0;.  
11310 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  m.zMalloc = 0;. 
11320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
11330 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
11340 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
11350 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
11360 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
11370 72 63 3b 0a 20 20 7d 0a 20 20 28 76 6f 69 64 29  rc;.  }.  (void)
11380 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
11390 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
113a0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
113b0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
113c0 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
113d0 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  ;.  lenRowid = s
113e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
113f0 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
11400 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
11410 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
11420 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
11430 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
11440 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
11450 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
11460 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
11470 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11480 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11490 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
114a0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
114b0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
114c0 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
114d0 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
114e0 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
114f0 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
11500 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
11510 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
11520 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
11530 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
11540 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
11550 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
11560 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
11570 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
11580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
11590 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
115a0 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72  Key is either cr
115b0 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
115c0 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
115d0 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
115e0 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
115f0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
11600 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
11610 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
11620 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
11630 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a  gnored as well..
11640 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
11650 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
11660 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  .  Cursor *pC,  
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11680 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
11690 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
116a0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
116b0 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 0a  ord *pUnpacked,.
116c0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
116d0 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  t u8 *pKey,   /*
116e0 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d 70   The key to comp
116f0 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  are */.  int *re
11700 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
11710 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11720 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
11730 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
11740 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
11750 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
11760 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
11770 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  pC->pCursor;.  i
11780 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d  nt lenRowid;.  M
11790 65 6d 20 6d 3b 0a 20 20 55 6e 70 61 63 6b 65 64  em m;.  Unpacked
117a0 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 0a 20 20  Record *pRec;.  
117b0 63 68 61 72 20 7a 53 70 61 63 65 5b 32 30 30 5d  char zSpace[200]
117c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
117d0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
117e0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
117f0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
11800 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
11810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11820 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d  OK;.  }.  m.db =
11830 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20   0;.  m.flags = 
11840 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d  0;.  m.zMalloc =
11850 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20   0;.  if( (rc = 
11860 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
11870 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
11880 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  sor, 0, nCellKey
11890 2c 20 31 2c 20 26 6d 29 29 0a 20 20 20 7c 7c 20  , 1, &m)).   || 
118a0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  (rc = sqlite3Vdb
118b0 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38  eIdxRowidLen((u8
118c0 2a 29 6d 2e 7a 2c 20 6d 2e 6e 2c 20 26 6c 65 6e  *)m.z, m.n, &len
118d0 52 6f 77 69 64 29 29 0a 20 20 29 7b 0a 20 20 20  Rowid)).  ){.   
118e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
118f0 20 20 69 66 28 20 21 70 55 6e 70 61 63 6b 65 64    if( !pUnpacked
11900 20 29 7b 0a 20 20 20 20 70 52 65 63 20 3d 20 73   ){.    pRec = s
11910 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
11920 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49  Unpack(pC->pKeyI
11930 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c  nfo, nKey, pKey,
11940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 7a 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   zSpace, sizeof(
11970 7a 53 70 61 63 65 29 29 3b 0a 20 20 7d 65 6c 73  zSpace));.  }els
11980 65 7b 0a 20 20 20 20 70 52 65 63 20 3d 20 70 55  e{.    pRec = pU
11990 6e 70 61 63 6b 65 64 3b 0a 20 20 7d 0a 20 20 69  npacked;.  }.  i
119a0 66 28 20 70 52 65 63 3d 3d 30 20 29 7b 0a 20 20  f( pRec==0 ){.  
119b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
119c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 2a 72 65  NOMEM;.  }.  *re
119d0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
119e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
119f0 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20  -lenRowid, m.z, 
11a00 70 52 65 63 29 3b 0a 20 20 69 66 28 20 21 70 55  pRec);.  if( !pU
11a10 6e 70 61 63 6b 65 64 20 29 7b 0a 20 20 20 20 73  npacked ){.    s
11a20 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
11a30 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70  UnpackedRecord(p
11a40 52 65 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Rec);.  }.  sqli
11a50 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
11a60 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
11a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11a80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11a90 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
11aa0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
11ab0 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
11ac0 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
11ad0 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
11ae0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
11af0 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
11b00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
11b10 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
11b20 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
11b30 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
11b40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
11b50 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
11b60 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
11b70 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
11b80 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
11b90 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
11ba0 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
11bb0 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
11bc0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
11bd0 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
11be0 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
11bf0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
11c00 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
11c10 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
11c20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
11c30 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
11c40 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
11c50 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
11c60 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
11c70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11c80 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
11c90 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
11ca0 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
11cb0 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
11cc0 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
11cd0 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
11ce0 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
11cf0 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
11d00 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
11d10 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
11d20 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
11d30 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
11d40 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
11d50 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
11d60 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
11d70 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
11d80 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
11d90 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
11da0 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
11db0 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
11dc0 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
11dd0 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
11de0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
11df0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
11e00 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
11e10 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
11e20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
11e30 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
11e40 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
11e50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
11e60 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
11e70 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
11e80 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
11e90 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
11ea0 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
11eb0 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
11ec0 7d 0a                                            }.