/ Hex Artifact Content
Login

Artifact 68ec5b5d6aaf48d24121a2ed6c23124dd001c735:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 31 35 20 32  eaux.c,v 1.415 2
02c0: 30 30 38 2f 31 31 2f 30 33 20 32 30 3a 35 35 3a  008/11/03 20:55:
02d0: 30 37 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  07 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 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
5160: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
5170: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
5180: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
5190: 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66      int malloc_f
51a0: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
51b0: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f  ocFailed;.    fo
51c0: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
51d0: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
51e0: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
51f0: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
5200: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
5210: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
5220: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
5230: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
5240: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
5250: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
5260: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
5270: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
5280: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
5290: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
52a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
52b0: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
52c0: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
52d0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
52e0: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
52f0: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
5300: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
5310: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
5320: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
5330: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
5340: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
5350: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
5360: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
5370: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
5380: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
5390: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
53a0: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
53b0: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
53c0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
53d0: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
53e0: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
53f0: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
5400: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
5410: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
5420: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
5430: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
5440: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
5450: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
5460: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
5470: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
5480: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
5490: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
54a0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
54b0: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
54c0: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
54d0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
54e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
54f0: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
5500: 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a  Agg|MEM_Dyn) ){.
5510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5520: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
5530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5540: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
5550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
5560: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
5570: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
5580: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
5590: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
55a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
55b0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
55c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
55d0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
55e0: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
55f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
5600: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74  Y_MANAGEMENT.int
5610: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65   sqlite3VdbeRele
5620: 61 73 65 42 75 66 66 65 72 73 28 56 64 62 65 20  aseBuffers(Vdbe 
5630: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  *p){.  int ii;. 
5640: 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a   int nFree = 0;.
5650: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5660: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
5670: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5680: 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d  for(ii=1; ii<=p-
5690: 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nMem; ii++){.  
56a0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
56b0: 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20  ->aMem[ii];.    
56c0: 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70  if( pMem->z && p
56d0: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  Mem->flags&MEM_D
56e0: 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  yn ){.      asse
56f0: 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20  rt( !pMem->xDel 
5700: 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b  );.      nFree +
5710: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5720: 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20  cSize(pMem->db, 
5730: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
5740: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
5750: 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20  lease(pMem);.   
5760: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5770: 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nFree;.}.#endif.
5780: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5790: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
57a0: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
57b0: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
57c0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
57d0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
57e0: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
57f0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
5800: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
5810: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
5820: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
5830: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
5840: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
5850: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
5860: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
5870: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
5880: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
5890: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
58a0: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
58b0: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
58c0: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
58d0: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
58e0: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
58f0: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
5900: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
5910: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
5920: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
5930: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
5940: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
5950: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
5960: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
5970: 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  PLAN..*/.int sql
5980: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
5990: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
59a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
59b0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71   VDBE */.){.  sq
59c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
59d0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
59e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
59f0: 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
5a00: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
5a10: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20  &p->aMem[1];..  
5a20: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
5a30: 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  in );.  if( p->m
5a40: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
5a50: 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51  _RUN ) return SQ
5a60: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61  LITE_MISUSE;.  a
5a70: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63  ssert( db->magic
5a80: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  ==SQLITE_MAGIC_B
5a90: 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  USY );.  assert(
5aa0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
5ab0: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
5ac0: 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a  TE_BUSY );..  /*
5ad0: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
5ae0: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
5af0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
5b00: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
5b10: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
5b20: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
5b30: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
5b40: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
5b50: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
5b60: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
5b70: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
5b80: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
5b90: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
5ba0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
5bb0: 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 0a 20  em, p->nMem);.. 
5bc0: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
5bd0: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
5be0: 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65  i<p->nOp && p->e
5bf0: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
5c00: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
5c10: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
5c20: 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  f( i>=p->nOp ){.
5c30: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
5c40: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
5c50: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
5c60: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
5c70: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
5c80: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
5c90: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
5ca0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5cb0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
5cc0: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
5cd0: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
5ce0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
5cf0: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  p->rc));.  }else
5d00: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
5d10: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d     Op *pOp = &p-
5d20: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aOp[i];.    if(
5d30: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
5d40: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
5d50: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5d60: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5d70: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5d80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
5d90: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
5dc0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
5dd0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20    pMem++;.  .   
5de0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5df0: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
5e00: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
5e10: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
5e20: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
5e30: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
5e40: 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20  de);  /* Opcode 
5e50: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
5e60: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
5e70: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
5e80: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5e90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
5ea0: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
5eb0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
5ec0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
5ed0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
5ee0: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
5ef0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5f00: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
5f10: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
5f40: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5f50: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
5f60: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
5f70: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
5f80: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
5f90: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
5fc0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5fd0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
5fe0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5ff0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
6000: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
6010: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
6020: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
6030: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
6060: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
6070: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
6080: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
6090: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
60a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
60b0: 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29  w(pMem, 32, 0) )
60c0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
60d0: 50 34 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 64  P4 */.      p->d
60e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
60f0: 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
6100: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6110: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
6120: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
6130: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
6140: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
6150: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
6160: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
6170: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
6180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
6190: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
61a0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
61b0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
61c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
61d0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
61e0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72     pMem->n = str
61f0: 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  len(pMem->z);.  
6200: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
6210: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
6220: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70   }.    pMem->typ
6230: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
6240: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
6250: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
6260: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
6270: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
6280: 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20  row(pMem, 4, 0) 
6290: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62  ){.        p->db
62a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
62b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
62c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
62d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
62e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
62f0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
6300: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
6310: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
6320: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6330: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
6340: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
6350: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
6360: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
6370: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
6380: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
6390: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
63a0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
63b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
63c0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f      if( pOp->zCo
63d0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  mment ){.       
63e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
63f0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
6400: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
6410: 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   = pOp->zComment
6420: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
6430: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
6440: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
6450: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
6460: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
6470: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
6480: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65  E_TEXT;.      }e
6490: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
64a0: 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   {.        pMem-
64b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
64c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
64d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
64e0: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ent */.        p
64f0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
6500: 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_NULL;.      }
6510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
6520: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
6530: 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  5*(p->explain-1)
6540: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
6550: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
6560: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
6570: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6580: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6590: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
65a0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
65b0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
65c0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
65d0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
65e0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
65f0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
6600: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
6610: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6620: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
6630: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
6640: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
6650: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
6660: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
6670: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
6680: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
6690: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=0 ){.    const
66a0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
66b0: 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28  p4.z;.    while(
66c0: 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a   isspace(*(u8*)z
66d0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69  ) ) z++;.    pri
66e0: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
66f0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
6700: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
6710: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
6720: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
6730: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
6740: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
6750: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
6760: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
6770: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
6780: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
6790: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
67a0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
67b0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
67c0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
67d0: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
67e0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
67f0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
6800: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
6810: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
6820: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
6830: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
6840: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
6850: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
6860: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
6870: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
6880: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
6890: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
68a0: 30 3b 20 69 73 73 70 61 63 65 28 28 75 6e 73 69  0; isspace((unsi
68b0: 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b  gned char)z[i]);
68c0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
68d0: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
68e0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 73 70 61  .      if( isspa
68f0: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
6900: 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  r)z[i]) ){.     
6910: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
6920: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
6930: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
6940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
6950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
6960: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
6970: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
6980: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
6990: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
69a0: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
69b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
69c0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
69d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
69e0: 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  OTRACE */.../*.*
69f0: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
6a00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
6a10: 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73  execution.  This
6a20: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
6a30: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
6a40: 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61  cating stack spa
6a50: 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ce and initializ
6a60: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
6a70: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
6a80: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
6a90: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
6aa0: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
6ab0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
6ac0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
6ad0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
6ae0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
6af0: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
6b00: 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42   a VDBE from VDB
6b10: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a  E_MAGIC_INIT to.
6b20: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  ** VDBE_MAGIC_RU
6b30: 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  N..*/.void sqlit
6b40: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
6b50: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
6b80: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
6bb0: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
6bc0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
6bd0: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
6c00: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
6c10: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
6c20: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
6c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6c40: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
6c50: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
6c60: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6c80: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
6c90: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
6ca0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
6cb0: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
6cc0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
6cd0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
6ce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6cf0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6d00: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
6d10: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
6d20: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
6d30: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
6d40: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
6d50: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
6d60: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
6d70: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
6d80: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
6d90: 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63  This.   * is bec
6da0: 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
6db0: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29   resizeOpArray()
6dc0: 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e   below may shrin
6dd0: 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f  k the.   * p->aO
6de0: 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76  p[] array to sav
6df0: 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c  e memory if call
6e00: 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f  ed when in VDBE_
6e10: 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20  MAGIC_RUN .   * 
6e20: 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70  state..   */.  p
6e30: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
6e40: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20  AGIC_RUN;..  /* 
6e50: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
6e60: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
6e70: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
6e80: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
6e90: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
6ea0: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
6eb0: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
6ec0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
6ed0: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
6ee0: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
6ef0: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
6f00: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
6f10: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
6f20: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
6f30: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
6f40: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
6f50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
6f60: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
6f70: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
6f80: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
6f90: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
6fa0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
6fb0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
6fc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
6fd0: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
6fe0: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
6ff0: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
7000: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
7010: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
7020: 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f  *.  ** Allocatio
7030: 6e 20 73 70 61 63 65 20 66 6f 72 20 72 65 67 69  n space for regi
7040: 73 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sters..  */.  if
7050: 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a  ( p->aMem==0 ){.
7060: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20      int nArg;   
7070: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
7080: 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61  umber of args pa
7090: 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66  ssed to a user f
70a0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
70b0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
70c0: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 2f  p, &nArg);.    /
70d0: 2a 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70  *resizeOpArray(p
70e0: 2c 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20 20 20  , p->nOp);*/.   
70f0: 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30   assert( nVar>=0
7100: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78   );.    if( isEx
7110: 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30  plain && nMem<10
7120: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65   ){.      p->nMe
7130: 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20  m = nMem = 10;. 
7140: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65 6d     }.    p->aMem
7150: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7160: 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20  ocZero(db,.     
7170: 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d     nMem*sizeof(M
7180: 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20  em)             
7190: 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20    /* aMem */.   
71a0: 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66     + nVar*sizeof
71b0: 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20  (Mem)           
71c0: 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20      /* aVar */. 
71d0: 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65       + nArg*size
71e0: 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20  of(Mem*)        
71f0: 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a        /* apArg *
7200: 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73  /.      + nVar*s
7210: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20  izeof(char*)    
7220: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61           /* azVa
7230: 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75  r */.      + nCu
7240: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
7250: 43 75 72 73 6f 72 2a 29 2b 31 20 20 2f 2a 20 61  Cursor*)+1  /* a
7260: 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  pCsr */.    );. 
7270: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
7280: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7290: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
72a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
72b0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
72c0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d  nMem */.      p-
72d0: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
72e0: 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f       /*       no
72f0: 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31  t from 0..nMem-1
7300: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56 61   */.      p->aVa
7310: 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65  r = &p->aMem[nMe
7320: 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  m+1];.      p->n
7330: 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20  Var = nVar;.    
7340: 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a    p->okVar = 0;.
7350: 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
7360: 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72   (Mem**)&p->aVar
7370: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
7380: 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a  >azVar = (char**
7390: 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d  )&p->apArg[nArg]
73a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
73b0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a 2a   = (VdbeCursor**
73c0: 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d  )&p->azVar[nVar]
73d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73  ;.      p->nCurs
73e0: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
73f0: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
7400: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
7410: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
7420: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
7430: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
7440: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
7450: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d    }.      for(n=
7460: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
7470: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  {.        p->aMe
7480: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
7490: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
74a0: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64  ->aMem[n].db = d
74b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
74c0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
74d0: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e  TE_DEBUG.  for(n
74e0: 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e  =1; n<p->nMem; n
74f0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
7500: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d   p->aMem[n].db==
7510: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
7520: 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  ..  p->pc = -1;.
7530: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
7540: 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65  _OK;.  p->unique
7550: 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72  Cnt = 0;.  p->er
7560: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
7570: 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  bort;.  p->expla
7580: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
7590: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
75a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
75b0: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
75c0: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
75d0: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
75e0: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
75f0: 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61  ;.  p->openedSta
7600: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64  tement = 0;.#ifd
7610: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
7620: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
7630: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
7640: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
7650: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
7670: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
7680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
7690: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
76a0: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
76b0: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
76c0: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
76d0: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
76e0: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
76f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7700: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
7710: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
7720: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
7730: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7740: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  n;.  }.  if( pCx
7750: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
7760: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
7770: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
7780: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
7790: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
77a0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
77b0: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
77c0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
77d0: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
77e0: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
77f0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
7800: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
7810: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
7820: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
7830: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
7840: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
7850: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
7860: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
7870: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
7880: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
7890: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
78a0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
78b0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
78c0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
78d0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
78e0: 20 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71   1;.    (void)sq
78f0: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70  lite3SafetyOff(p
7900: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75  ->db);.    pModu
7910: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
7920: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f  Cursor);.    (vo
7930: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
7940: 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70  On(p->db);.    p
7950: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
7960: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
7970: 20 69 66 28 20 21 70 43 78 2d 3e 65 70 68 65 6d   if( !pCx->ephem
7980: 50 73 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20  PseudoTable ){. 
7990: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
79a0: 28 70 2d 3e 64 62 2c 20 70 43 78 2d 3e 70 44 61  (p->db, pCx->pDa
79b0: 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ta);.  }.}../*.*
79c0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
79d0: 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72 20 56  ors except for V
79e0: 54 61 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  Tab cursors that
79f0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
7a00: 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  * in use..*/.sta
7a10: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
7a20: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
7a30: 74 69 76 65 56 74 61 62 73 28 56 64 62 65 20 2a  tiveVtabs(Vdbe *
7a40: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
7a50: 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29  f( p->apCsr==0 )
7a60: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
7a70: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
7a80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64 62 65  ; i++){.    Vdbe
7a90: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
7aa0: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66  apCsr[i];.    if
7ab0: 28 20 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56  ( pC && (!p->inV
7ac0: 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43  tabMethod || !pC
7ad0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20 29  ->pVtabCursor) )
7ae0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7af0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
7b00: 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61   pC);.      p->a
7b10: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
7b20: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7b30: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
7b40: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
7b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7b60: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
7b70: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
7b80: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
7b90: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
7ba0: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
7bb0: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
7bc0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
7bd0: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
7be0: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
7bf0: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
7c00: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
7c10: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
7c20: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
7c30: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 63 6c 6f 73   = p->db;.  clos
7c40: 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70  eAllCursorsExcep
7c50: 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b  tActiveVtabs(p);
7c60: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70  .  for(i=1; i<=p
7c70: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
7c80: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
7c90: 28 26 70 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 4d 45  (&p->aMem[i], ME
7ca0: 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  M_Null);.  }.  r
7cb0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
7cc0: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
7cd0: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
7ce0: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
7cf0: 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66 28 20 70  >sFifo);.  if( p
7d00: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 29  ->contextStack )
7d10: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7d20: 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  <p->contextStack
7d30: 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Top; i++){.     
7d40: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
7d50: 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e 74 65 78  Clear(&p->contex
7d60: 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69 66 6f 29  tStack[i].sFifo)
7d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7d80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7d90: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a  >contextStack);.
7da0: 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74    }.  p->context
7db0: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  Stack = 0;.  p->
7dc0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74  contextStackDept
7dd0: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  h = 0;.  p->cont
7de0: 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b  extStackTop = 0;
7df0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7e00: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
7e10: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
7e20: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
7e30: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
7e40: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
7e50: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
7e60: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
7e70: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
7e80: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
7e90: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
7ea0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
7eb0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
7ec0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
7ed0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
7ee0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
7ef0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
7f00: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
7f10: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
7f20: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
7f30: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
7f40: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7f50: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
7f60: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
7f70: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
7f80: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
7f90: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
7fa0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
7fb0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
7fc0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
7fd0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
7fe0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
7ff0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
8000: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
8010: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
8020: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
8030: 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e  umn = nResColumn
8040: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
8050: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
8060: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
8070: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8080: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
8090: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
80a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
80b0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
80c0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
80d0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
80e0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
80f0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
8100: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
8110: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
8120: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
8130: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
8140: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
8150: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
8160: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
8170: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
8180: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
8190: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
81a0: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
81b0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
81c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
81d0: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
81e0: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
81f0: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
8200: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
8210: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
8220: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
8230: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
8240: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
8250: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
8260: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
8270: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
8280: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
8290: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
82a0: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
82b0: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
82c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
82d0: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
82e0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8300: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
8310: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
8320: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8340: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
8350: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
8360: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
8390: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
83a0: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
83b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83d0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
83e0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
83f0: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
8400: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
8410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
8420: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
8430: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
8440: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
8450: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
8460: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
8470: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
8480: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
8490: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
84a0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
84b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
84c0: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
84d0: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
84e0: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
84f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8500: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8510: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
8520: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
8530: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
8540: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
8550: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
8560: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
8570: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
8580: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
8590: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
85a0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
85b0: 63 46 61 69 6c 65 64 20 7c 7c 20 21 7a 4e 61 6d  cFailed || !zNam
85c0: 65 20 7c 7c 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  e || pColName->f
85d0: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 20 29 3b  lags&MEM_Term );
85e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
85f0: 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72  ./*.** A read or
8600: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
8610: 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  on may or may no
8620: 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64  t be active on d
8630: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
8640: 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73  * db. If a trans
8650: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
8660: 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20  , commit it. If 
8670: 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72  there is a.** wr
8680: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
8690: 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68  spanning more th
86a0: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
86b0: 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69  file, this routi
86c0: 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65  ne.** takes care
86d0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
86e0: 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e  ournal trickery.
86f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
8700: 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  dbeCommit(sqlite
8710: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
8720: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
8730: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
8740: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
8750: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
8760: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
8770: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
8780: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8790: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
87a0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  = 0;..  /* Befor
87b0: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
87c0: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
87d0: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
87e0: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
87f0: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
8800: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
8810: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
8820: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
8830: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
8840: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
8850: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
8860: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
8870: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
8880: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
8890: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
88a0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
88b0: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
88c0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
88d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
88e0: 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a  abSync(db, &p->z
88f0: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
8900: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8910: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8920: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f   }..  /* This lo
8930: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
8940: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
8950: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
8960: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
8970: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
8980: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
8990: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
89a0: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
89b0: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
89c0: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
89d0: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
89e0: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
89f0: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
8a00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
8a10: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
8a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
8a30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
8a40: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
8a50: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
8a60: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
8a70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
8a80: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
8a90: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8aa0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
8ab0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
8ac0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
8ad0: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58  ) ){.      needX
8ae0: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
8af0: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72    if( i!=1 ) nTr
8b00: 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ans++;.    }.  }
8b10: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
8b20: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
8b30: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
8b40: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
8b50: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
8b60: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
8b70: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
8b80: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76 6f  lback ){.    (vo
8b90: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
8ba0: 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20  Off(db);.    rc 
8bb0: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
8bc0: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
8bd0: 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69 64  tArg);.    (void
8be0: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e  )sqlite3SafetyOn
8bf0: 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
8c00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8c10: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
8c20: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NT;.    }.  }.. 
8c30: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
8c40: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
8c50: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
8c60: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
8c70: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
8c80: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
8c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
8ca0: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
8cb0: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
8cc0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
8cd0: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
8ce0: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
8cf0: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
8d00: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
8d10: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
8d20: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
8d30: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
8d40: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
8d50: 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
8d60: 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
8d70: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
8d80: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
8d90: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
8da0: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
8db0: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
8dc0: 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
8dd0: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65  /.  if( 0==strle
8de0: 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n(sqlite3BtreeGe
8df0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
8e00: 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54  b[0].pBt)) || nT
8e10: 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66  rans<=1 ){.    f
8e20: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
8e30: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
8e40: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
8e50: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8e60: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8e70: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
8e80: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8e90: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
8ea0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
8eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8ec0: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
8ed0: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
8ee0: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
8ef0: 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
8f00: 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
8f10: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
8f20: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
8f30: 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
8f40: 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
8f50: 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
8f60: 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
8f70: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
8f80: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
8f90: 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
8fa0: 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
8fb0: 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
8fc0: 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
8fd0: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
8fe0: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
8ff0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
9000: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
9010: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
9020: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
9030: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
9040: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
9050: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
9060: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
9070: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
9080: 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  o(pBt);.      }.
9090: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
90a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
90b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
90c0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
90d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
90e0: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
90f0: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
9100: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
9110: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
9120: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
9130: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
9140: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
9150: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
9160: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
9170: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
9180: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9190: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
91a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
91b0: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
91c0: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
91d0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
91e0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
91f0: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
9200: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
9210: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
9220: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
9230: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
9240: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
9250: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
9260: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
9270: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
9280: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
9290: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
92a0: 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  s;..    /* Selec
92b0: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
92c0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
92d0: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
92e0: 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  32 random;.     
92f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9300: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
9310: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
9320: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e  mness(sizeof(ran
9330: 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a  dom), &random);.
9340: 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20        zMaster = 
9350: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9360: 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20  b, "%s-mj%08X", 
9370: 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f  zMainFile, rando
9380: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
9390: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
93a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
93b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
93c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
93d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
93e0: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
93f0: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
9400: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
9410: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
9420: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
9430: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
9440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9450: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
9460: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
9470: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
9480: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
9490: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
94a0: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
94b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
94c0: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
94d0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
94e0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
94f0: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
9500: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
9510: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
9520: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
9530: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9540: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
9550: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
9560: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
9570: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9580: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
9590: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
95a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
95b0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
95c0: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
95d0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
95e0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
95f0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
9600: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
9610: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
9620: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9630: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
9640: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
9650: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
9660: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
9670: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
9680: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
9690: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
96a0: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
96b0: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
96c0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
96d0: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
96e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
96f0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
9700: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
9710: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9720: 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f     if( i==1 ) co
9730: 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e  ntinue;   /* Ign
9740: 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ore the TEMP dat
9750: 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  abase */.      i
9760: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
9770: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
9780: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
9790: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
97a0: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
97b0: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
97c0: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
97d0: 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  0]==0 ) continue
97e0: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65  ;  /* Ignore :me
97f0: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
9800: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
9810: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
9820: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
9830: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
9840: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
9850: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
9860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9870: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
9880: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c  ter, zFile, strl
9890: 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  en(zFile)+1, off
98a0: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
98b0: 66 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a  fset += strlen(z
98c0: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
98d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
98e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
98f0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
9900: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
9910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
9920: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
9930: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
9940: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9950: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
9960: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9970: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
9980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9990: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
99a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
99b0: 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
99c0: 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
99d0: 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
99e0: 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
99f0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
9a00: 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20  /.    zMainFile 
9a10: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
9a20: 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62  tDirname(db->aDb
9a30: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66  [0].pBt);.    if
9a40: 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  ( (needSync .   
9a50: 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74 65    && (0==(sqlite
9a60: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
9a70: 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
9a80: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
9a90: 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20 20  EQUENTIAL)).    
9aa0: 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f   && (rc=sqlite3O
9ab0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
9ac0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
9ad0: 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  L))!=SQLITE_OK) 
9ae0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9af0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
9b00: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
9b10: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
9b20: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
9b30: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9b40: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
9b50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
9b60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9b70: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
9b80: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
9b90: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
9ba0: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
9bb0: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
9bc0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9bd0: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
9be0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
9bf0: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
9c00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
9c10: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
9c20: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9c30: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
9c40: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
9c50: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
9c60: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
9c70: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
9c80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9c90: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
9ca0: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
9cb0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
9cc0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
9cd0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
9ce0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
9cf0: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
9d00: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
9d10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9d20: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
9d30: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
9d40: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
9d50: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
9d60: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
9d70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9d80: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
9d90: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
9da0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
9db0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
9dc0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
9dd0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
9de0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9df0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9e00: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
9e10: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
9e20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
9e30: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
9e40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
9e50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9e60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9e70: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
9e80: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9e90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
9ea0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
9eb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
9ec0: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
9ed0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
9ee0: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
9ef0: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
9f00: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
9f10: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
9f20: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
9f30: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
9f40: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
9f50: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
9f60: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
9f70: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
9f80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9f90: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
9fa0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
9fb0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
9fc0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
9fe0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
9ff0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
a000: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
a010: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
a020: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
a030: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
a040: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
a050: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
a060: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
a070: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
a080: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
a090: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
a0a0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
a0b0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
a0c0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
a0d0: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
a0e0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
a0f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
a100: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
a110: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
a120: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
a130: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
a140: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
a150: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
a160: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
a170: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
a180: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
a190: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
a1a0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
a1b0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
a1c0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a1d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
a1e0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
a1f0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
a200: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
a210: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
a220: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a230: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
a240: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
a250: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
a260: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
a270: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
a280: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
a290: 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
a2a0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
a2b0: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
a2c0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
a2d0: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
a2e0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
a2f0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
a300: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
a310: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
a320: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
a330: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
a340: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
a350: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
a360: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
a370: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
a380: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
a390: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
a3a0: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
a3b0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
a3c0: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
a3d0: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
a3e0: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
a3f0: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
a400: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
a410: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
a420: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
a430: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
a440: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
a450: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
a460: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
a470: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
a480: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
a490: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
a4a0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
a4b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
a4c0: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
a4d0: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
a4e0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
a4f0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
a500: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
a510: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
a520: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
a530: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
a540: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
a550: 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74  or every Btree t
a560: 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  hat in database 
a570: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68  connection db wh
a580: 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e  ich .** has been
a590: 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70   modified, "trip
a5a0: 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  " or invalidate 
a5b0: 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a  each cursor in.*
a5c0: 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67  * that Btree mig
a5d0: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ht have been mod
a5e0: 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68  ified so that th
a5f0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
a600: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67  never be used ag
a610: 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65  ain.  This happe
a620: 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ns when a rollba
a630: 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ck.*** occurs.  
a640: 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20  We have to trip 
a650: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75  all the other cu
a660: 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63  rsors, even.** c
a670: 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72  ursor from other
a680: 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e   VMs in differen
a690: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
a6a0: 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68  ctions,.** so th
a6b0: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20  at none of them 
a6c0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64  try to use the d
a6d0: 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65  ata at which the
a6e0: 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69  y.** were pointi
a6f0: 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77  ng and which now
a700: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
a710: 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f  hanged due.** to
a720: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
a730: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
a740: 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61  at a rollback ca
a750: 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20  n delete tables 
a760: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20  complete and.** 
a770: 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65  reorder rootpage
a780: 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74  s.  So it is not
a790: 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74   sufficient just
a7a0: 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20   to save.** the 
a7b0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
a7c0: 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  sor.  We have to
a7d0: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
a7e0: 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61  cursor.** so tha
a7f0: 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73  t it is never us
a800: 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61  ed again..*/.sta
a810: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
a820: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
a830: 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74  fiedBtrees(sqlit
a840: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
a850: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
a860: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
a870: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
a880: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
a890: 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65   if( p && sqlite
a8a0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
a8b0: 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
a8c0: 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
a8d0: 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45  ursors(p, SQLITE
a8e0: 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20  _ABORT);.    }. 
a8f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
a900: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a910: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
a920: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
a930: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
a940: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
a950: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
a960: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
a970: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
a980: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
a990: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
a9a0: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
a9b0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
a9c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a9d0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
a9e0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
a9f0: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
aa00: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
aa10: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
aa20: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
aa30: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
aa40: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
aa50: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
aa60: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
aa70: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
aa80: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
aa90: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
aaa0: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
aab0: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
aac0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
aad0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
aae0: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
aaf0: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
ab00: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
ab10: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
ab20: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
ab30: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
ab40: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
ab50: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
ab60: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
ab70: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
ab80: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46  nt i;.  int (*xF
ab90: 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29  unc)(Btree *pBt)
aba0: 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69   = 0;  /* Functi
abb0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61  on to call on ea
abc0: 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64  ch btree backend
abd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63   */.  int isSpec
abe0: 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
abf0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
ac00: 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f  rue if SQLITE_NO
ac10: 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a  MEM or IOERR */.
ac20: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
ac30: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
ac40: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
ac50: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
ac60: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
ac70: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
ac80: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
ac90: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
aca0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
acb0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
acc0: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
acd0: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
ace0: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
acf0: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
ad00: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
ad10: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
ad20: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
ad30: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
ad40: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
ad50: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
ad60: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
ad70: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
ad80: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
ad90: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
ada0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
adb0: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
adc0: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
add0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
ade0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
adf0: 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
ae00: 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
ae10: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
ae20: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
ae30: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
ae40: 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
ae50: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
ae60: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
ae70: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
ae80: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
ae90: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
aea0: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69  iveVtabs(p);.  i
aeb0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
aec0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
aed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aee0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
aef0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
af00: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
af10: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
af20: 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
af30: 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
af40: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
af50: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=0 ){.    int 
af60: 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
af70: 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
af80: 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20 20  m p->rc */..    
af90: 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
afa0: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
afb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
afc0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
afd0: 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e  xArrayEnter(&p->
afe0: 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  aMutex);..    /*
aff0: 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
b000: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
b010: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
b020: 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
b030: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
b040: 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
b050: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
b060: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
b090: 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
b0a0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
b0b0: 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
b0c0: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
b0d0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73  * This loop does
b0e0: 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73   static analysis
b0f0: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 74 6f   of the query to
b100: 20 73 65 65 20 77 68 69 63 68 20 6f 66 20 74 68   see which of th
b110: 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  e.      ** follo
b120: 77 69 6e 67 20 74 68 72 65 65 20 63 61 74 65 67  wing three categ
b130: 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69  ories it falls i
b140: 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  nto:.      **.  
b150: 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d      **     Read-
b160: 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20  only.      **   
b170: 20 20 51 75 65 72 79 20 77 69 74 68 20 73 74 61    Query with sta
b180: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  tement journal. 
b190: 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72       **     Quer
b1a0: 79 20 77 69 74 68 6f 75 74 20 73 74 61 74 65 6d  y without statem
b1b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent journal.    
b1c0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
b1d0: 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68   could do someth
b1e0: 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74  ing more elegant
b1f0: 20 74 68 61 6e 20 74 68 69 73 20 73 74 61 74 69   than this stati
b200: 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e  c analysis (i.e.
b210: 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  .      ** store 
b220: 74 68 65 20 74 79 70 65 20 6f 66 20 71 75 65 72  the type of quer
b230: 79 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  y as part of the
b240: 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61   compliation pha
b250: 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20 20  se), but .      
b260: 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c  ** handling mall
b270: 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
b280: 72 65 20 69 73 20 61 20 66 61 69 72 6c 79 20 6f  re is a fairly o
b290: 62 73 63 75 72 65 20 65 64 67 65 20 63 61 73 65  bscure edge case
b2a0: 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   so .      ** th
b2b0: 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20 65  is is probably e
b2c0: 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67  asier. Todo: Mig
b2d0: 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72 74 75  ht be an opportu
b2e0: 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65 20 0a  nity to reduce .
b2f0: 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 73 69        ** code si
b300: 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c 6c 20  ze a very small 
b310: 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e  amount though...
b320: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b330: 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20  int notReadOnly 
b340: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
b350: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  sStatement = 0;.
b360: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e        assert(p->
b370: 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30  aOp || p->nOp==0
b380: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
b390: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
b3a0: 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  { .        switc
b3b0: 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  h( p->aOp[i].opc
b3c0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
b3d0: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
b3e0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  tion:.          
b3f0: 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 7c 3d    notReadOnly |=
b400: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b 0a 20   p->aOp[i].p2;. 
b410: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b420: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
b430: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20   OP_Statement:. 
b440: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74 61             isSta
b450: 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  tement = 1;.    
b460: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b470: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b480: 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  ..   .      /* I
b490: 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
b4a0: 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65  read-only, we ne
b4b0: 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63  ed do no rollbac
b4c0: 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77  k at all. Otherw
b4d0: 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72  ise,.      ** pr
b4e0: 6f 63 65 65 64 20 77 69 74 68 20 74 68 65 20 73  oceed with the s
b4f0: 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
b500: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b510: 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20  if( notReadOnly 
b520: 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
b530: 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
b540: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
b550: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
b560: 4b 45 44 20 26 26 20 69 73 53 74 61 74 65 6d 65  KED && isStateme
b570: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
b580: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
b590: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
b5a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
b5b0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
b5c0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
b5d0: 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
b5e0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
b5f0: 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 69  QLITE_FULL) && i
b600: 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  sStatement ){.  
b610: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
b620: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b630: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
b640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b650: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
b660: 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
b670: 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
b680: 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
b690: 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
b6a0: 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
b6b0: 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
b6c0: 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
b6d0: 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
b6e0: 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
b6f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c  .          inval
b700: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
b710: 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
b720: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b730: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b740: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
b750: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
b760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b770: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
b780: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
b790: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
b7a0: 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
b7b0: 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76  he only active v
b7c0: 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  dbe, then.    **
b7d0: 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
b7e0: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
b7f0: 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
b800: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
b810: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
b820: 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
b830: 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
b840: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
b850: 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
b860: 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
b870: 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f  occured. .    */
b880: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74  .    if( db->aut
b890: 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61  oCommit && db->a
b8a0: 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20  ctiveVdbeCnt==1 
b8b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
b8c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
b8d0: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
b8e0: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
b8f0: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
b900: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
b910: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
b920: 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68   is true, and th
b930: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
b940: 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  as .        ** s
b950: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74  uccessful or hit
b960: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
b970: 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d  nstraint. This m
b980: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
b990: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
b9a0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  uired..        *
b9b0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  /.        int rc
b9c0: 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
b9d0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , p);.        if
b9e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
b9f0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  Y ){.          s
ba00: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
ba10: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
ba20: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
ba30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba40: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
ba50: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
ba60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ba70: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
ba80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ba90: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
baa0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
bab0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bac0: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
bad0: 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
bae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
baf0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
bb00: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
bb10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bb20: 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20  else if( !xFunc 
bb30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
bb40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
bb50: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
bb60: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
bb70: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65      if( p->opene
bb80: 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  dStatement ){.  
bb90: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
bba0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
bbb0: 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  itStmt;.        
bbc0: 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  } .      }else i
bbd0: 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
bbe0: 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
bbf0: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
bc00: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
bc10: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d  ackStmt;.      }
bc20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
bc30: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
bc40: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
bc50: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
bc60: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
bc70: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
bc80: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
bc90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bca0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e   .    /* If xFun
bcb0: 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  c is not NULL, t
bcc0: 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66  hen it is one of
bcd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
bce0: 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20  lbackStmt or.   
bcf0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
bd00: 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c  CommitStmt. Call
bd10: 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68   it once on each
bd20: 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20   backend. If an 
bd30: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20  error occurs.   
bd40: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75   ** and the retu
bd50: 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c  rn code is still
bd60: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20   SQLITE_OK, set 
bd70: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
bd80: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
bd90: 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20  * error value.. 
bda0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
bdb0: 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20  (!xFunc ||.     
bdc0: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
bdd0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c  treeCommitStmt |
bde0: 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73  |.      xFunc==s
bdf0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
be00: 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20  ackStmt.    );. 
be10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e     for(i=0; xFun
be20: 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  c && i<db->nDb; 
be30: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
be40: 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65   rc;.      Btree
be50: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
be60: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
be70: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
be80: 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29   rc = xFunc(pBt)
be90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
bea0: 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49   && (p->rc==SQLI
beb0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
bec0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bed0: 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  T) ){.          
bee0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
bef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
bf00: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
bf10: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
bf20: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
bf30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bf40: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
bf50: 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
bf60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
bf70: 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65  r DELETE and the
bf80: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63   statement was c
bf90: 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a  ommitted, .    *
bfa0: 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65  * set the change
bfb0: 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a   counter. .    *
bfc0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
bfd0: 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70  ngeCntOn && p->p
bfe0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c>=0 ){.      if
bff0: 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e  ( !xFunc || xFun
c000: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43  c==sqlite3BtreeC
c010: 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20  ommitStmt ){.   
c020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c030: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
c040: 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
c050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c060: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
c070: 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
c080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
c090: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
c0a0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c   }.  .    /* Rol
c0b0: 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20  lback or commit 
c0c0: 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67  any schema chang
c0d0: 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  es that occurred
c0e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
c0f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
c100: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
c110: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
c120: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c130: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
c140: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ema(db, 0);.    
c150: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64    db->flags = (d
c160: 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54  b->flags | SQLIT
c170: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
c180: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c190: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
c1a0: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
c1b0: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c  BtreeMutexArrayL
c1c0: 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29  eave(&p->aMutex)
c1d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
c1e0: 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
c1f0: 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
c200: 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
c210: 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
c220: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
c230: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
c240: 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a  eVdbeCnt--;.  }.
c250: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
c260: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
c270: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
c280: 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
c290: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c2a0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
c2b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c2c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
c2d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
c2e0: 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
c2f0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
c300: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
c310: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
c320: 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
c330: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
c340: 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
c350: 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
c360: 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
c370: 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
c380: 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
c390: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c3a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
c3b0: 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
c3c0: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
c3d0: 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
c3e0: 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
c3f0: 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
c400: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
c410: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
c420: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
c430: 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
c440: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
c450: 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
c460: 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
c470: 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
c480: 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
c490: 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
c4a0: 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
c4b0: 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
c4c0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
c4d0: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
c4e0: 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
c4f0: 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
c500: 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
c510: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
c520: 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
c530: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
c540: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
c550: 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
c560: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
c570: 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
c580: 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
c590: 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
c5a0: 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
c5b0: 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
c5c0: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
c5d0: 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
c5e0: 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
c5f0: 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76  t now..  */.  (v
c600: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
c610: 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  yOn(db);.  sqlit
c620: 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20  e3VdbeHalt(p);. 
c630: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
c640: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20  fetyOff(db);..  
c650: 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
c660: 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
c670: 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
c680: 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
c690: 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
c6a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
c6b0: 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
c6c0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
c6d0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
c6e0: 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
c6f0: 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
c700: 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
c710: 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
c720: 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
c730: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
c740: 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
c750: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
c760: 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
c770: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
c780: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
c790: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
c7a0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
c7b0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
c7c0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
c7d0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
c7e0: 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
c7f0: 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
c800: 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
c810: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
c820: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
c830: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64  alloc();.      d
c840: 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
c850: 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
c860: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
c870: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70  ErrMsg);.      p
c880: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
c890: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
c8a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
c8b0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
c8c0: 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
c8d0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
c8e0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
c8f0: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
c900: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
c910: 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
c920: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
c930: 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
c940: 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
c950: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
c960: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
c970: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
c980: 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
c990: 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
c9a0: 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
c9b0: 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
c9c0: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
c9d0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
c9e0: 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
c9f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
ca00: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
ca10: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
ca20: 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
ca30: 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
ca40: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
ca50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
ca60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ca70: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
ca80: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
ca90: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
caa0: 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
cab0: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
cac0: 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
cad0: 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
cae0: 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
caf0: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
cb00: 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
cb10: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
cb20: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
cb30: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
cb40: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
cb50: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
cb60: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
cb70: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
cb80: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
cb90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cba0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
cbb0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
cbc0: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
cbd0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
cbe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
cbf0: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
cc00: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cc10: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
cc20: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
cc30: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
cc40: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
cc50: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
cc60: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
cc70: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
cc80: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
cc90: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
cca0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
ccb0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
ccc0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
ccd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
cce0: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
ccf0: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
cd00: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
cd10: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
cd20: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
cd30: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
cd40: 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  INIT;.  return p
cd50: 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
cd60: 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
cd70: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
cd80: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
cd90: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
cda0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
cdb0: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
cdc0: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
cdd0: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
cde0: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
cdf0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
ce00: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
ce10: 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
ce20: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ce30: 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
ce40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
ce50: 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
ce60: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
ce70: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
ce80: 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
ce90: 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
cea0: 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
ceb0: 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65  )==rc );.  }else
cec0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
ced0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
cee0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
cef0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
cf00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
cf10: 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
cf20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61   rc;.}../*.** Ca
cf30: 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ll the destructo
cf40: 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61  r for each auxda
cf50: 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62  ta entry in pVdb
cf60: 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a  eFunc for which.
cf70: 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ** the correspon
cf80: 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b  ding bit in mask
cf90: 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64   is clear.  Auxd
cfa0: 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f  ata entries beyo
cfb0: 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77  nd 31.** are alw
cfc0: 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20  ays destroyed.  
cfd0: 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61  To destroy all a
cfe0: 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20  uxdata entries, 
cff0: 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  call this.** rou
d000: 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d  tine with mask==
d010: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
d020: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
d030: 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56  ata(VdbeFunc *pV
d040: 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73  dbeFunc, int mas
d050: 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  k){.  int i;.  f
d060: 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46  or(i=0; i<pVdbeF
d070: 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b  unc->nAux; i++){
d080: 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44  .    struct AuxD
d090: 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64  ata *pAux = &pVd
d0a0: 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d  beFunc->apAux[i]
d0b0: 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20  ;.    if( (i>31 
d0c0: 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29  || !(mask&(1<<i)
d0d0: 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78  )) && pAux->pAux
d0e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
d0f0: 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
d100: 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
d110: 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
d120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d130: 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a  pAux->pAux = 0;.
d140: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
d150: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
d160: 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
d170: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
d180: 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
d190: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
d1a0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d   *db;..  if( p==
d1b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  0 ) return;.  db
d1c0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
d1d0: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
d1e0: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
d1f0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
d200: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
d210: 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
d220: 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
d230: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
d240: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
d250: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
d260: 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
d270: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
d280: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
d290: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66   = p->aOp;.    f
d2a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
d2b0: 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i++, pOp++){. 
d2c0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
d2d0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
d2e0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
d2f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
d300: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d310: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
d320: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
d330: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d340: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d350: 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  aOp);.  }.  rele
d360: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
d370: 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
d380: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d390: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  b, p->aLabel);. 
d3a0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d3b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d3c0: 65 28 64 62 2c 20 26 70 2d 3e 61 4d 65 6d 5b 31  e(db, &p->aMem[1
d3d0: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
d3e0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
d3f0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
d400: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
d410: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d420: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
d430: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d440: 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
d450: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
d460: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
d470: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d480: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
d490: 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
d4a0: 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
d4b0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
d4c0: 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
d4d0: 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
d4e0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
d4f0: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20  or code.  If no 
d500: 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e  MoveTo is pendin
d510: 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  g, this.** routi
d520: 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20  ne does nothing 
d530: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
d540: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
d550: 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
d560: 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
d570: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
d580: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
d590: 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
d5a0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d5b0: 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
d5c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
d5d0: 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
d5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d5f0: 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
d600: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d610: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
d620: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
d630: 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
d640: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
d650: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d660: 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
d670: 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e  d = keyToInt(p->
d680: 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20  movetoTarget);. 
d690: 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
d6a0: 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20  id = res==0;.   
d6b0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
d6c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d6d0: 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75  BtreeNext(p->pCu
d6e0: 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
d6f0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d700: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66  rn rc;.    }.#if
d710: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
d720: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
d730: 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
d740: 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
d750: 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
d760: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
d770: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
d780: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70    }else if( p->p
d790: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 6e  Cursor ){.    in
d7a0: 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20  t hasMoved;.    
d7b0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
d7c0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
d7d0: 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ved(p->pCursor, 
d7e0: 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20  &hasMoved);.    
d7f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d800: 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d  rc;.    if( hasM
d810: 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  oved ){.      p-
d820: 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
d830: 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
d840: 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31    p->nullRow = 1
d850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
d860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d870: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
d880: 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
d890: 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
d8a0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
d8b0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
d8c0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
d8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d8e0: 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
d8f0: 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
d900: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
d910: 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
d920: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
d930: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
d940: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
d950: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
d960: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
d970: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
d980: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
d990: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
d9a0: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
d9b0: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
d9c0: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
d9d0: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
d9e0: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
d9f0: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
da00: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
da10: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
da20: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
da30: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
da40: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
da50: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
da60: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
da70: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
da80: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
da90: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
daa0: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
dab0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
dac0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
dad0: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
dae0: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
daf0: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
db00: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
db10: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
db20: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
db30: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
db40: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
db50: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
db60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
db70: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
db80: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
db90: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
dba0: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
dbb0: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
dbc0: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
dbd0: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
dbe0: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
dbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
dc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
dc10: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
dc30: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
dc40: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
dc60: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
dc70: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
dc80: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
dc90: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
dca0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
dcb0: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
dce0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
dcf0: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
dd00: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
dd10: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
dd20: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
dd50: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
dd60: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
dd80: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
dd90: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
dda0: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
ddb0: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
ddc0: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
ddd0: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
ddf0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
de00: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
de10: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
de20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
de30: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
de40: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
de50: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
de80: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
de90: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
dea0: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
deb0: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
dec0: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
ded0: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
dee0: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
def0: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
df00: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
df10: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
df20: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
df30: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
df40: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
df50: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
df60: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
df70: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
df80: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
df90: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
dfa0: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
dfb0: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
dfc0: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
dfd0: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
dfe0: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
dff0: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
e000: 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
e010: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
e020: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
e030: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
e040: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
e050: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e060: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
e070: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
e080: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
e090: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
e0a0: 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
e0b0: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
e0c0: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
e0d0: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
e0e0: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
e0f0: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
e100: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
e110: 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  +i;.    }.    u 
e120: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
e130: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
e140: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
e150: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
e160: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
e170: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
e180: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
e190: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
e1a0: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
e1b0: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
e1c0: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
e1d0: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
e1e0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
e1f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
e200: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e210: 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
e220: 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
e230: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
e240: 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d  b) );.  n = pMem
e250: 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
e260: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
e270: 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
e280: 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  i;.  }.  assert(
e290: 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
e2a0: 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
e2b0: 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
e2c0: 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
e2d0: 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
e2e0: 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
e2f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
e300: 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
e310: 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  al-type..*/.int 
e320: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e330: 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
e340: 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
e350: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
e360: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
e370: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
e380: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
e390: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
e3a0: 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
e3b0: 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
e3c0: 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
e3d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
e3e0: 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
e3f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
e400: 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
e410: 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
e420: 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
e430: 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
e440: 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
e450: 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
e460: 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
e470: 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
e480: 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
e490: 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
e4a0: 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
e4b0: 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
e4c0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
e4d0: 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
e4e0: 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
e4f0: 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
e500: 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
e510: 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
e520: 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
e530: 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
e540: 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
e550: 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
e560: 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
e570: 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
e580: 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
e590: 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
e5a0: 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
e5b0: 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
e5c0: 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
e5d0: 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
e5e0: 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
e5f0: 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
e600: 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
e610: 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
e620: 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
e630: 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
e640: 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
e650: 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
e660: 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
e670: 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
e680: 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
e690: 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
e6a0: 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
e6b0: 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
e6c0: 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
e6d0: 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
e6e0: 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
e6f0: 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
e700: 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
e710: 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
e720: 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
e730: 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
e740: 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
e750: 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
e760: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
e770: 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
e780: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
e790: 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
e7a0: 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
e7b0: 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
e7c0: 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
e7d0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
e7e0: 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
e7f0: 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
e800: 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
e810: 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
e820: 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
e830: 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
e840: 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
e850: 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
e860: 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
e870: 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
e880: 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
e890: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
e8a0: 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
e8b0: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
e8c0: 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
e8d0: 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
e8e0: 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
e8f0: 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
e900: 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
e910: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
e920: 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
e930: 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
e940: 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
e950: 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
e960: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
e970: 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
e980: 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
e990: 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
e9a0: 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
e9b0: 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
e9c0: 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
e9d0: 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
e9e0: 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
e9f0: 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
ea00: 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
ea10: 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
ea20: 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
ea30: 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
ea40: 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
ea50: 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
ea60: 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
ea70: 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
ea80: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
ea90: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
eaa0: 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
eab0: 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
eac0: 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
ead0: 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
eae0: 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
eaf0: 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
eb00: 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
eb10: 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
eb20: 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
eb30: 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
eb40: 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
eb50: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
eb60: 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
eb70: 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
eb80: 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
eb90: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
eba0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
ebb0: 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
ebc0: 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
ebd0: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
ebe0: 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
ebf0: 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
ec00: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
ec10: 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
ec20: 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
ec30: 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
ec40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ec50: 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
ec60: 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
ec70: 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
ec80: 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
ec90: 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
eca0: 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
ecb0: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
ecc0: 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
ecd0: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
ece0: 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
ecf0: 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
ed00: 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
ed10: 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
ed20: 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
ed30: 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
ed40: 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
ed50: 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
ed60: 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
ed70: 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
ed80: 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
ed90: 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
eda0: 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
edb0: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
edc0: 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
edd0: 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
ede0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
edf0: 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
ee00: 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
ee10: 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
ee20: 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
ee30: 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
ee40: 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
ee50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ee60: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
ee70: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
ee80: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
ee90: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
eea0: 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
eeb0: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
eec0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
eed0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
eee0: 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
eef0: 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
ef00: 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e  in buf[]..*/ .in
ef10: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
ef20: 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
ef30: 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
ef40: 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
ef50: 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
ef60: 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
ef70: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
ef80: 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
ef90: 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  at);.  int len;.
efa0: 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
efb0: 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
efc0: 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
efd0: 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
efe0: 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
eff0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
f000: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
f010: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f020: 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
f030: 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
f040: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
f050: 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
f060: 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
f070: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
f080: 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
f090: 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
f0a0: 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
f0b0: 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
f0c0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
f0d0: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
f0e0: 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
f0f0: 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  =nBuf );.    whi
f100: 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
f110: 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46   buf[i] = (v&0xF
f120: 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
f130: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
f140: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
f150: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
f160: 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
f170: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
f180: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
f190: 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
f1a0: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
f1b0: 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20  em->u.i:0).     
f1c0: 20 20 20 20 20 20 20 20 3d 3d 20 73 71 6c 69 74          == sqlit
f1d0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
f1e0: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
f1f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f200: 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b  pMem->n<=nBuf );
f210: 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
f220: 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
f230: 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
f240: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  );.    if( pMem-
f250: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
f260: 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b  o ){.      len +
f270: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
f280: 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20     if( len>nBuf 
f290: 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
f2a0: 20 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20   nBuf;.      }. 
f2b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66       memset(&buf
f2c0: 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65  [pMem->n], 0, le
f2d0: 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  n-pMem->n);.    
f2e0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
f2f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
f300: 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
f310: 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
f320: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73   0;.}../*.** Des
f330: 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
f340: 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
f350: 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
f360: 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
f370: 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
f380: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
f390: 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
f3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
f3b0: 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73   read..*/ .int s
f3c0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f3d0: 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
f3e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
f3f0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
f400: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
f410: 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
f420: 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
f430: 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
f440: 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
f450: 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
f460: 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
f470: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
f480: 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
f490: 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
f4a0: 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
f4b0: 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
f4c0: 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
f4d0: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
f4e0: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
f4f0: 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
f500: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
f510: 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
f520: 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20    /* NULL */.   
f530: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f540: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
f550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f560: 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
f570: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
f580: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
f590: 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65  em->u.i = (signe
f5a0: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20  d char)buf[0];. 
f5b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f5c0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
f5d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
f5e0: 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
f5f0: 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
f600: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
f610: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
f620: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
f630: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
f640: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f650: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
f670: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
f680: 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
f690: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f6a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f6b0: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
f6c0: 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
f6d0: 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
f6e0: 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
f6f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f700: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
f710: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
f720: 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
f730: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
f740: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
f750: 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34  .i = (buf[0]<<24
f760: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
f770: 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
f780: 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
f790: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f7a0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f7b0: 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
f7c0: 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
f7d0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f7e0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  er */.      u64 
f7f0: 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  x = (((signed ch
f800: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
f810: 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75   buf[1];.      u
f820: 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c  32 y = (buf[2]<<
f830: 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31  24) | (buf[3]<<1
f840: 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29  6) | (buf[4]<<8)
f850: 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20   | buf[5];.     
f860: 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
f870: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
f880: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
f890: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f8a0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
f8b0: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
f8c0: 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
f8d0: 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
f8e0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
f8f0: 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
f900: 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
f910: 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b   */.      u64 x;
f920: 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69  .      u32 y;.#i
f930: 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
f940: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
f950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
f960: 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
f970: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
f980: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
f990: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
f9a0: 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
f9b0: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72        ** byte or
f9c0: 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
f9d0: 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
f9e0: 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
f9f0: 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  T is.      ** de
fa00: 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
fa10: 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
fa20: 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
fa30: 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a  re mixed.      *
fa40: 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20  * endian..      
fa50: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
fa60: 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
fa70: 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
fa80: 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74  <<32;.      stat
fa90: 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
faa0: 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  r1 = 1.0;.      
fab0: 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
fac0: 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
fad0: 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
fae0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
faf0: 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
fb00: 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
fb10: 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
fb20: 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  )==0 );.#endif..
fb30: 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30        x = (buf[0
fb40: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
fb50: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
fb60: 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
fb70: 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c      y = (buf[4]<
fb80: 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c  <24) | (buf[5]<<
fb90: 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38  16) | (buf[6]<<8
fba0: 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20  ) | buf[7];.    
fbb0: 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
fbc0: 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  y;.      if( ser
fbd0: 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
fbe0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69         pMem->u.i
fbf0: 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
fc00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
fc10: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
fc20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc30: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
fc40: 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
fc50: 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a  (pMem->r)==8 );.
fc60: 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65          swapMixe
fc70: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
fc80: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
fc90: 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69  &pMem->r, &x, si
fca0: 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20  zeof(x));.      
fcb0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
fcc0: 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
fcd0: 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  m->r) ? MEM_Null
fce0: 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20   : MEM_Real;.   
fcf0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
fd00: 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 8;.    }.    c
fd10: 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
fd20: 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
fd30: 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
fd40: 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70  ger 1 */.      p
fd50: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
fd60: 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
fd70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
fd80: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
fd90: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
fda0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
fdb0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72    int len = (ser
fdc0: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
fdd0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
fde0: 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
fdf0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
fe00: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
fe10: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
fe20: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
fe30: 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
fe40: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
fe50: 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
fe60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fe70: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
fe80: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
fe90: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
fea0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
feb0: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
fec0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
fed0: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
fee0: 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
fef0: 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
ff00: 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 74 68  pKey[], parse th
ff10: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f  e.** record into
ff20: 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72   a UnpackedRecor
ff30: 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  d structure.  Re
ff40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
ff50: 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 63 74  o.** that struct
ff60: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ure..**.** The c
ff70: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
ff80: 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 73 7a  might provide sz
ff90: 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 20 6d  Space bytes of m
ffa0: 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 61  emory.** space a
ffb0: 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 73 20  t pSpace.  This 
ffc0: 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 73 65  space can be use
ffd0: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  d to hold the re
ffe0: 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61  turned.** VDbePa
fff0: 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  rsedRecord struc
10000 74 75 72 65 20 69 66 20 69 74 20 69 73 20 6c 61  ture if it is la
10010 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 66 20  rge enough.  If 
10020 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67  it is.** not big
10030 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 20 69   enough, space i
10040 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
10050 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
10060 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
10070 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 20 73  rned structure s
10080 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
10090 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  by a call to.** 
100a0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
100b0 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
100c0 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52  )..*/ .UnpackedR
100d0 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
100e0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
100f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
10100 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
10110 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10120 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
10130 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
10140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10150 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
10160 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
10170 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
10180 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
10190 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
101a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
101b0 53 70 61 63 65 2c 2f 2a 20 53 70 61 63 65 20 61  Space,/* Space a
101c0 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64  vailable to hold
101d0 20 72 65 73 75 6c 74 69 6e 67 20 6f 62 6a 65 63   resulting objec
101e0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  t */.  int szSpa
101f0 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ce            /*
10200 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
10210 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  ] in bytes */.){
10220 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
10230 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
10240 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10250 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e  har *)pKey;.  Un
10260 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
10270 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
10280 69 6e 74 20 69 64 78 2c 20 64 3b 0a 20 20 75 31  int idx, d;.  u1
10290 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
102a0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
102b0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
102c0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
102d0 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 0a 20 20  Mem *pMem;.  .  
102e0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 4d  assert( sizeof(M
102f0 65 6d 29 3e 73 69 7a 65 6f 66 28 2a 70 29 20 29  em)>sizeof(*p) )
10300 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
10310 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
10320 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29 3b 0a 20 20  o->nField+2);.  
10330 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
10340 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  e ){.    p = sql
10350 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
10360 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
10370 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  yte);.    if( p=
10380 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
10390 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
103a0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45  PACKED_NEED_FREE
103b0 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   | UNPACKED_NEED
103c0 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73  _DESTROY;.  }els
103d0 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 70 61 63  e{.    p = pSpac
103e0 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  e;.    p->flags 
103f0 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  = UNPACKED_NEED_
10400 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70  DESTROY;.  }.  p
10410 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
10420 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
10430 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
10440 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e  Field + 1;.  p->
10450 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 26 28  aMem = pMem = &(
10460 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b 0a 20 20 69  (Mem*)p)[1];.  i
10470 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
10480 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
10490 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
104a0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
104b0 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
104c0 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
104d0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
104e0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
104f0 72 69 6e 74 33 32 28 20 61 4b 65 79 2b 69 64 78  rint32( aKey+idx
10500 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
10510 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65 79 20      if( d>=nKey 
10520 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
10530 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
10540 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62 72 65  al_type)>0 ) bre
10550 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ak;.    pMem->en
10560 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
10570 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
10580 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
10590 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
105a0 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  = 0;.    pMem->z
105b0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
105c0 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
105d0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
105e0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
105f0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
10600 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d  ++;.    u++;.  }
10610 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
10620 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
10630 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
10640 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20  d = u;.  return 
10650 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a  (void*)p;.}../*.
10660 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10670 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63  destroys a Unpac
10680 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74  kedRecord object
10690 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
106a0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
106b0 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65  edRecord(Unpacke
106c0 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
106d0 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
106e0 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  p->flags & UNPAC
106f0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
10700 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
10710 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
10720 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
10730 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69   pMem=p->aMem; i
10740 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c  <p->nField; i++,
10750 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20   pMem++){.      
10760 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c    if( pMem->zMal
10770 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  loc ){.         
10780 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
10790 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
107a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
107b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
107c0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
107d0 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20  D_NEED_FREE ){. 
107e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
107f0 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ee(p->pKeyInfo->
10800 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  db, p);.    }.  
10810 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
10820 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
10830 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
10840 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
10850 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
10860 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
10870 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
10880 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
10890 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
108a0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
108b0 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
108c0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
108d0 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
108e0 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
108f0 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
10900 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
10910 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
10920 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63  by th OP_MakeRec
10930 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
10940 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
10950 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
10960 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
10970 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
10980 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
10990 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
109a0 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
109b0 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
109c0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
109d0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
109e0 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65  ields..** The ke
109f0 79 20 77 69 74 68 20 66 65 77 65 72 20 66 69 65  y with fewer fie
10a00 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63  lds is usually c
10a10 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68 61  ompares less tha
10a20 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72  n the .** longer
10a30 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69   key.  However i
10a40 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
10a50 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20  NCRKEY flags in 
10a60 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a  pPKey2 is set.**
10a70 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   and the common 
10a80 70 72 65 66 69 78 65 73 20 61 72 65 20 65 71 75  prefixes are equ
10a90 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73  al, then key1 is
10aa0 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e   less than key2.
10ab0 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e  .** Or if the UN
10ac0 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45  PACKED_MATCH_PRE
10ad0 46 49 58 20 66 6c 61 67 20 69 73 20 73 65 74 20  FIX flag is set 
10ae0 61 6e 64 20 74 68 65 20 70 72 65 66 69 78 65 73  and the prefixes
10af0 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74   are.** equal, t
10b00 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65  hen the keys are
10b10 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
10b20 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74  e equal and.** t
10b30 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20  he parts beyond 
10b40 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
10b50 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  x are ignored..*
10b60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e 50 41  *.** If the UNPA
10b70 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49  CKED_IGNORE_ROWI
10b80 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  D flag is set, t
10b90 68 65 6e 20 74 68 65 20 6c 61 73 74 20 62 79 74  hen the last byt
10ba0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61 64  e of.** the head
10bb0 65 72 20 6f 66 20 70 4b 65 79 31 20 69 73 20 69  er of pKey1 is i
10bc0 67 6e 6f 72 65 64 2e 20 20 49 74 20 69 73 20 61  gnored.  It is a
10bd0 73 73 75 6d 65 64 20 74 68 61 74 20 70 4b 65 79  ssumed that pKey
10be0 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78  1 is.** an index
10bf0 20 6b 65 79 2c 20 61 6e 64 20 74 68 75 73 20 65   key, and thus e
10c00 6e 64 73 20 77 69 74 68 20 61 20 72 6f 77 69 64  nds with a rowid
10c10 20 76 61 6c 75 65 2e 20 20 54 68 65 20 6c 61 73   value.  The las
10c20 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  t byte.** of the
10c30 20 68 65 61 64 65 72 20 77 69 6c 6c 20 74 68 65   header will the
10c40 72 65 66 6f 72 65 20 62 65 20 74 68 65 20 73 65  refore be the se
10c50 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
10c60 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f   rowid:.** one o
10c70 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c  f 1, 2, 3, 4, 5,
10c80 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74 68   6, 8, or 9 - th
10c90 65 20 69 6e 74 65 67 65 72 20 73 65 72 69 61 6c  e integer serial
10ca0 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73   types..** The s
10cb0 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
10cc0 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 77 69  e final rowid wi
10cd0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 73  ll always be a s
10ce0 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42  ingle byte..** B
10cf0 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 69 73 20  y ignoring this 
10d00 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  last byte of the
10d10 20 68 65 61 64 65 72 2c 20 77 65 20 66 6f 72 63   header, we forc
10d20 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
10d30 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  .** to ignore th
10d40 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
10d50 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69  nd of key1..*/.i
10d60 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
10d70 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69  cordCompare(.  i
10d80 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
10d90 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
10da0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
10db0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
10dc0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
10dd0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
10de0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
10df0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
10e00 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
10e10 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
10e20 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
10e30 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10e40 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
10e50 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
10e60 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
10e70 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
10e80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10e90 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
10ea0 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  t i = 0;.  int n
10eb0 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20  Field;.  int rc 
10ec0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
10ed0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
10ee0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
10ef0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
10f00 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
10f10 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
10f20 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
10f30 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
10f40 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  o;.  mem1.enc = 
10f50 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
10f60 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
10f70 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e  nfo->db;.  mem1.
10f80 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d  flags = 0;.  mem
10f90 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  1.zMalloc = 0;. 
10fa0 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
10fb0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
10fc0 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
10fd0 48 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65  Hdr1;.  if( pPKe
10fe0 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
10ff0 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49  CKED_IGNORE_ROWI
11000 44 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d  D ){.    szHdr1-
11010 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20  -;.  }.  nField 
11020 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
11030 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78  ld;.  while( idx
11040 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
11050 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a  Key2->nField ){.
11060 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
11070 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
11080 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
11090 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
110a0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
110b0 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
110c0 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
110d0 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
110e0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20  rial_type1 );.  
110f0 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
11100 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
11110 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
11120 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
11130 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  eak;..    /* Ext
11140 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
11150 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
11160 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
11170 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11180 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
11190 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
111a0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
111b0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
111c0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
111d0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
111e0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
111f0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20  y2->aMem[i],.   
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64          i<nField
11220 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
11230 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
11240 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
11250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11260 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69      i++;.  }.  i
11270 66 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  f( mem1.zMalloc 
11280 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
11290 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a  Release(&mem1);.
112a0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
112b0 20 20 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72      /* rc==0 her
112c0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
112d0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
112e0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
112f0 6e 64 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68  nd.    ** all th
11300 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
11310 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
11320 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50  qual. If the UNP
11330 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20  ACKED_INCRKEY.  
11340 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
11350 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65  , then break the
11360 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67   tie by treating
11370 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e   key2 as larger.
11380 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 55  .    ** If the U
11390 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
113a0 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c  TCH flag is set,
113b0 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20   then keys with 
113c0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a  common prefixes.
113d0 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69      ** are consi
113e0 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
113f0 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
11400 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
11410 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72   the .    ** lar
11420 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70  ger.  As it happ
11430 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20  ens, the pPKey2 
11440 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74  will always be t
11450 68 65 20 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a  he longer.    **
11460 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
11470 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a  ifference..    *
11480 2f 0a 20 20 20 20 69 66 28 20 70 50 4b 65 79 32  /.    if( pPKey2
11490 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
114a0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
114b0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
114c0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
114d0 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
114e0 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
114f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
11500 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20  ve rc==0 */.    
11510 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73  }else if( idx1<s
11520 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 20 20 72  zHdr1 ){.      r
11530 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
11540 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
11550 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
11560 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
11570 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
11580 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
11590 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
115a0 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
115b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
115c0 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  .}. ../*.** pCur
115d0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
115e0 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
115f0 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
11600 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
11610 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
11620 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
11630 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
11640 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
11650 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
11660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
11670 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
11680 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
11690 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
116a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
116b0 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72  beIdxRowid(BtCur
116c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
116d0 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
116e0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
116f0 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
11700 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
11710 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
11720 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
11730 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
11740 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
11750 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
11760 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
11770 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
11780 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
11790 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
117a0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
117b0 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
117c0 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
117d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
117e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
117f0 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20    m.flags = 0;. 
11800 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a   m.db = 0;.  m.z
11810 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63  Malloc = 0;.  rc
11820 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
11830 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
11840 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
11850 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
11860 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11870 0a 20 20 7d 0a 20 20 28 76 6f 69 64 29 67 65 74  .  }.  (void)get
11880 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
11890 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 28 76 6f  z, szHdr);.  (vo
118a0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
118b0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
118c0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
118d0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
118e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
118f0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
11900 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
11910 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
11920 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
11930 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
11940 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
11950 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
11960 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
11970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11980 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  OK;.}../*.** Com
11990 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
119a0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
119b0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
119c0 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e  s point to again
119d0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
119e0 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66  ring in pKey (of
119f0 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20   length nKey).  
11a00 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
11a10 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
11a20 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
11a30 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
11a40 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
11a50 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
11a60 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
11a70 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20  n pKey.  Return 
11a80 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
11a90 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79  cess..**.** pKey
11aa0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
11ab0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
11ac0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
11ad0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
11ae0 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
11af0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
11b00 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
11b10 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
11b20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
11b30 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
11b40 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
11b50 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
11b60 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
11b70 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
11b80 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
11b90 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
11ba0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  ntire key..**.**
11bb0 20 70 55 6e 70 61 63 6b 65 64 20 6d 61 79 20 62   pUnpacked may b
11bc0 65 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 76 65  e an unpacked ve
11bd0 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 2c 6e 4b  rsion of pKey,nK
11be0 65 79 2e 20 20 49 66 20 70 55 6e 70 61 63 6b 65  ey.  If pUnpacke
11bf0 64 20 69 73 0a 2a 2a 20 73 75 70 70 6c 69 65 64  d is.** supplied
11c00 20 69 74 20 69 73 20 75 73 65 64 20 69 6e 20 70   it is used in p
11c10 6c 61 63 65 20 6f 66 20 70 4b 65 79 2c 6e 4b 65  lace of pKey,nKe
11c20 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
11c30 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
11c40 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72  re(.  VdbeCursor
11c50 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
11c60 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
11c70 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
11c80 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
11c90 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
11ca0 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  d,  /* Unpacked 
11cb0 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20  version of pKey 
11cc0 61 6e 64 20 6e 4b 65 79 20 2a 2f 0a 20 20 69 6e  and nKey */.  in
11cd0 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
11ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
11cf0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
11d00 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
11d10 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
11d20 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
11d30 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
11d40 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
11d50 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71  ;.  Mem m;..  sq
11d60 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
11d70 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
11d80 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
11d90 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65  ey<=0 ){.    *re
11da0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
11db0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11dc0 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d  .  m.db = 0;.  m
11dd0 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e  .flags = 0;.  m.
11de0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72  zMalloc = 0;.  r
11df0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
11e00 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
11e10 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c  pCursor, 0, nCel
11e20 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
11e30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
11e40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
11e50 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
11e60 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
11e70 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
11e80 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
11e90 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
11ea0 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
11eb0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
11ec0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
11ed0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
11ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11ef0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11f00 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
11f10 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
11f20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
11f30 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
11f40 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
11f50 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
11f60 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
11f70 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
11f80 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
11f90 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
11fa0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
11fb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11fc0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11fd0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
11fe0 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
11ff0 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
12000 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
12010 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
12020 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
12030 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
12040 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
12050 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
12060 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
12070 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
12080 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
12090 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
120a0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
120b0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
120c0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
120d0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
120e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
120f0 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
12100 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
12110 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
12120 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
12130 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
12140 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
12150 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
12160 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
12170 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
12180 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
12190 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
121a0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
121b0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
121c0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
121d0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
121e0 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
121f0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
12200 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
12210 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
12220 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
12230 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
12240 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
12250 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
12260 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
12270 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12280 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
12290 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
122a0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
122b0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
122c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
122d0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
122e0 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
122f0 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
12300 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
12310 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
12320 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
12330 0a 7d 0a                                         .}.