/ Hex Artifact Content
Login

Artifact 5645351aed834221dac9f059f79021b5295a8626:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 33 39 30 20 32  eaux.c,v 1.390 2
02c0: 30 30 38 2f 30 36 2f 32 30 20 31 38 3a 31 33 3a  008/06/20 18:13:
02d0: 32 35 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  25 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 20 20 20 20 7d 0a 23  pOp->p2;.    }.#
1d30: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 70  endif.    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 5f 66 72 65 65 28  .  sqlite3_free(
2030: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d  p->aLabel);.  p-
2040: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20  >aLabel = 0;..  
2050: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20  *pMaxFuncArgs = 
2060: 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f 2a 20  nMaxArgs;..  /* 
2070: 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c  If we never roll
2080: 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
2090: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
20a0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  en statement.  *
20b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  * transactions a
20c0: 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  re not needed.  
20d0: 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20  So change every 
20e0: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a  OP_Statement.  *
20f0: 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e  * opcode into an
2100: 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20   OP_Noop.  This 
2110: 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20  avoid a call to 
2120: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2130: 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68  lusive().  ** wh
2140: 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ich can be expen
2150: 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61  sive on some pla
2160: 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69  tforms..  */.  i
2170: 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  f( hasStatementB
2180: 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61  egin && !doesSta
2190: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29  tementRollback )
21a0: 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d  {.    for(pOp=p-
21b0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
21c0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
21d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21e0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
21f0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
2200: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2210: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
2220: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2230: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2240: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2250: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2260: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2270: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2280: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
2290: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
22a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
22b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
22c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
22d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
22e0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
22f0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
2300: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
2310: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
2320: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
2330: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
2340: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
2350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2360: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
2370: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
2380: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
2390: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
23a0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
23b0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
23c0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
23d0: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
23e0: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41  ){.    resizeOpA
23f0: 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c  rray(p, p->nOpAl
2400: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
2410: 63 2a 32 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f  c*2 : 1024/sizeo
2420: 66 28 4f 70 29 29 3b 0a 20 20 20 20 61 73 73 65  f(Op));.    asse
2430: 72 74 28 20 70 2d 3e 6e 4f 70 2b 6e 4f 70 3c 3d  rt( p->nOp+nOp<=
2440: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 7c 7c 20 70  p->nOpAlloc || p
2450: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2460: 65 64 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ed );.  }.  if( 
2470: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
2480: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
2490: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
24a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
24b0: 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  nOp>0 ){.    int
24c0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
24d0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
24e0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
24f0: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
2500: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
2510: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
2520: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
2530: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
2540: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
2550: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
2560: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
2570: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
2580: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26        if( p2<0 &
2590: 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63  & sqlite3VdbeOpc
25a0: 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 70  odeHasProperty(p
25b0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50 46  Out->opcode, OPF
25c0: 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20 20 20  LG_JUMP) ){.    
25d0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
25e0: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
25f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2600: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
2610: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
2620: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
2630: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
2640: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
2650: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
2660: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
2670: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
2680: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2690: 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d  EBUG.      pOut-
26a0: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20  >zComment = 0;. 
26b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26c0: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
26d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26e0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
26f0: 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b  i+addr, &p->aOp[
2700: 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20  i+addr]);.      
2710: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2720: 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70     p->nOp += nOp
2730: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2740: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ddr;.}../*.** Ch
2750: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
2760: 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  f the P1 operand
2770: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
2780: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
2790: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27a0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
27b0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
27c0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
27d0: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
27e0: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
27f0: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
2800: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
2810: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
2820: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
2830: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
2840: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
2850: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2860: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
2870: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
2880: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2890: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
28a0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
28b0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
28c0: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
28d0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
28e0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
28f0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2900: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
2910: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2920: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2930: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2940: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
2950: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
2960: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
2970: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2980: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
2990: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
29a0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
29b0: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
29c0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
29d0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
29e0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
29f0: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
2a00: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
2a10: 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p2 = val;.  }
2a20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2a30: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2a40: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P3 operand for
2a50: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2a60: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
2a70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a80: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP3(Vdbe *p, in
2a90: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2aa0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2ab0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2ac0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2ad0: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2ae0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2af0: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2b00: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2b10: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
2b20: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2b30: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2b40: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
2b50: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2b60: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
2b70: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2b80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2b90: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
2ba0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
2bb0: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2bc0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2bd0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
2be0: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
2bf0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
2c00: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
2c10: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
2c20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2c30: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
2c40: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
2c50: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
2c60: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
2c70: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2c80: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2c90: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
2ca0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2cb0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
2cc0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
2cd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2ce0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
2cf0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
2d00: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
2d10: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
2d20: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
2d30: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
2d40: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
2d50: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
2d60: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
2d70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2d80: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2d90: 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a 70 44  tion(FuncDef *pD
2da0: 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20  ef){.  if( pDef 
2db0: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
2dc0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
2dd0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
2de0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 66  qlite3_free(pDef
2df0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2e00: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
2e10: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
2e20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2e30: 72 65 65 50 34 28 69 6e 74 20 70 34 74 79 70 65  reeP4(int p4type
2e40: 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69  , void *p3){.  i
2e50: 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69  f( p3 ){.    swi
2e60: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
2e70: 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41       case P4_REA
2e80: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  L:.      case P4
2e90: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61  _INT64:.      ca
2ea0: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20  se P4_MPRINTF:. 
2eb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e       case P4_DYN
2ec0: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
2ed0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P4_KEYINFO:.   
2ee0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
2ef0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
2f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2f10: 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20  ee(p3);.        
2f20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2f30: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44 42       case P4_VDB
2f40: 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20  EFUNC: {.       
2f50: 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65   VdbeFunc *pVdbe
2f60: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
2f70: 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20 20 66   *)p3;.        f
2f80: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2f90: 74 69 6f 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e  tion(pVdbeFunc->
2fa0: 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  pFunc);.        
2fb0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
2fc0: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
2fd0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
2fe0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 64  sqlite3_free(pVd
2ff0: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
3000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3010: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
3020: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
3030: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3040: 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a  nction((FuncDef*
3050: 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p3);.        br
3060: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3070: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
3080: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3090: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
30a0: 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a  te3_value*)p3);.
30b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  .}.../*.** Chang
30e0: 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72  e N opcodes star
30f0: 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20  ting at addr to 
3100: 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20  No-ops..*/.void 
3110: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3120: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
3130: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e   int addr, int N
3140: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
3150: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
3160: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
3170: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 77 68 69  p[addr];.    whi
3180: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20  le( N-- ){.     
3190: 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74   freeP4(pOp->p4t
31a0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
31b0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  .      memset(pO
31c0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
31d0: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70  [0]));.      pOp
31e0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
31f0: 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b  op;.      pOp++;
3200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
3210: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3220: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
3230: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3240: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3250: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3260: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
3270: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
3280: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
3290: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
32a0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
32b0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
32c0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
32d0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
32e0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
32f0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
3300: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
3310: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
3320: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
3330: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
3340: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
3350: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
3360: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3370: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
3380: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
3390: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
33a0: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
33b0: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
33c0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
33d0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
33e0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
33f0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a  es of zP4..**.**
3400: 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46   If n==P4_KEYINF
3410: 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  O it means that 
3420: 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72  zP4 is a pointer
3430: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
3440: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f  ructure..** A co
3450: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
3460: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
3470: 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ure into memory 
3480: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
3490: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c   sqlite3_malloc,
34a0: 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65   to be freed whe
34b0: 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69  n the Vdbe is fi
34c0: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50  nalized..** n==P
34d0: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
34e0: 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  F indicates that
34f0: 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61   zP4 points to a
3500: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
3510: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
3520: 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20  memory that the 
3530: 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69  caller has obtai
3540: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3550: 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a  _malloc. The .**
3560: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
3570: 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f  ot free the allo
3580: 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  cation, it will 
3590: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
35a0: 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e  e Vdbe is.** fin
35b0: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f  alized..** .** O
35c0: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
35d0: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
35e0: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
35f0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
3600: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
3610: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
3620: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
3630: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
3640: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
3650: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
3660: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
3670: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
3680: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
3690: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
36a0: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
36b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
36c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
36d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
36e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
36f0: 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P4(Vdbe *p, int 
3700: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
3710: 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP4, int n){. 
3720: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65   Op *pOp;.  asse
3730: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3740: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3750: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3760: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
3770: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
3780: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
3790: 20 69 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59   if (n != P4_KEY
37a0: 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72  INFO) {.      fr
37b0: 65 65 50 34 28 6e 2c 20 28 76 6f 69 64 2a 29 2a  eeP4(n, (void*)*
37c0: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
37d0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b     }.    return;
37e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
37f0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
3800: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
3810: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
3820: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
3830: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
3840: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
3850: 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50  p[addr];.  freeP
3860: 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  4(pOp->p4type, p
3870: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
3880: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
3890: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
38a0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
38b0: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
38c0: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
38d0: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
38e0: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
38f0: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
3900: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
3910: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
3920: 70 34 2e 69 20 3d 20 28 69 6e 74 29 7a 50 34 3b  p4.i = (int)zP4;
3930: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3940: 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = n;.  }else if
3950: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
3960: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
3970: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3980: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
3990: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
39a0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
39b0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
39c0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
39d0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
39e0: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
39f0: 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP4)->nField;. 
3a00: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3a10: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3a20: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3a30: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3a40: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3a50: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3a60: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79  lite3Malloc( nBy
3a70: 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  te );.    pOp->p
3a80: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  4.pKeyInfo = pKe
3a90: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
3aa0: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
3ab0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3ac0: 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP4, nByte);. 
3ad0: 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63       /* In the c
3ae0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
3af0: 61 74 69 6f 6e 2c 20 50 34 5f 4b 45 59 49 4e 46  ation, P4_KEYINF
3b00: 4f 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  O is only ever u
3b10: 73 65 64 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  sed on.      ** 
3b20: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3b30: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 20  es that have no 
3b40: 61 53 6f 72 74 4f 72 64 65 72 20 63 6f 6d 70 6f  aSortOrder compo
3b50: 6e 65 6e 74 2e 20 20 45 6c 65 6d 65 6e 74 73 0a  nent.  Elements.
3b60: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e        ** with an
3b70: 20 61 53 6f 72 74 4f 72 64 65 72 20 61 6c 77 61   aSortOrder alwa
3b80: 79 73 20 75 73 65 20 50 34 5f 4b 45 59 49 4e 46  ys use P4_KEYINF
3b90: 4f 5f 48 41 4e 44 4f 46 46 2e 20 20 53 6f 20 77  O_HANDOFF.  So w
3ba0: 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  e do not.      *
3bb0: 2a 20 6e 65 65 64 20 74 6f 20 62 6f 74 68 65 72  * need to bother
3bc0: 20 77 69 74 68 20 64 75 70 6c 69 63 61 74 69 6e   with duplicatin
3bd0: 67 20 74 68 65 20 61 53 6f 72 74 4f 72 64 65 72  g the aSortOrder
3be0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
3bf0: 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
3c00: 72 74 4f 72 64 65 72 3d 3d 30 20 29 3b 0a 23 69  rtOrder==0 );.#i
3c10: 66 20 30 0a 20 20 20 20 20 20 61 53 6f 72 74 4f  f 0.      aSortO
3c20: 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
3c30: 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  >aSortOrder;.   
3c40: 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65     if( aSortOrde
3c50: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  r ){.        pKe
3c60: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3c70: 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  r = (unsigned ch
3c80: 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  ar*)&pKeyInfo->a
3c90: 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  Coll[nField];.  
3ca0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65        memcpy(pKe
3cb0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3cc0: 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e  r, aSortOrder, n
3cd0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Field);.      }.
3ce0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4f 70  #endif.      pOp
3cf0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
3d00: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3d10: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
3d20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3d30: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3d40: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3d50: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
3d60: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
3d70: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
3d80: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3d90: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3da0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
3db0: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
3dc0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
3dd0: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
3de0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3df0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3e00: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3e10: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34  ) n = strlen(zP4
3e20: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
3e30: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
3e40: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
3e50: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
3e60: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
3e70: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3e80: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
3e90: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
3ea0: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
3eb0: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
3ec0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
3ed0: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
3ee0: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
3ef0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
3f00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
3f10: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
3f20: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
3f30: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
3f40: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
3f50: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
3f60: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
3f70: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
3f80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
3f90: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
3fa0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
3fb0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3fc0: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
3fd0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
3fe0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
3ff0: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
4000: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
4010: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
4020: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4030: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
4040: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
4050: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
4060: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
4070: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
4080: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
4090: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
40a0: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
40b0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
40c0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
40d0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
40e0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
40f0: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
4100: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
4110: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
4120: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
4130: 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65  ist ap;.  sqlite
4140: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
4150: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72  P_Noop);.  asser
4160: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
4170: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
4180: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
4190: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
41a0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
41b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
41c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
41d0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
41e0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
41f0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4200: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
4210: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
4220: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4230: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  e(*pz);.    *pz 
4240: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
4250: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
4260: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
4270: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
4280: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
4290: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
42a0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
42b0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
42c0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
42d0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
42e0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
42f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
4300: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
4310: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
4320: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
4330: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
4340: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4350: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61   );.  return ((a
4360: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
4370: 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b  ->nOp)?(&p->aOp[
4380: 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69  addr]):0);.}..#i
4390: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
43a0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
43b0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
43c0: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
43d0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
43e0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
43f0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4400: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
4410: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
4420: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
4430: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
4440: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
4450: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
4460: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
4470: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
4480: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
4490: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
44a0: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
44b0: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
44c0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
44d0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
44e0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
44f0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
4500: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
4510: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
4520: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
4530: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
4540: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
4550: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
4560: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
4570: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4580: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
4590: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
45a0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
45b0: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
45c0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
45d0: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
45e0: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
45f0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4600: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4610: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
4620: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
4630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4640: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
4650: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
4660: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
4670: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4680: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4690: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
46b0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
46c0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
46d0: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
46e0: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
46f0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4700: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4710: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
4720: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4730: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
4740: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4750: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
4760: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
4770: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
4780: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
4790: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
47a0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
47b0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
47c0: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
47d0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
47e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
47f0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4800: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4810: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
4820: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
4830: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
4840: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4850: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
4860: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
4870: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
4880: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
4890: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
48a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
48b0: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
48c0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
48d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
48e0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
48f0: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
4900: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
4910: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
4920: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4930: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4940: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
4950: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
4960: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
4970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4980: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
4990: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
49a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
49b0: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
49c0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
49d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
49e0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
49f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4a00: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4a10: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
4a20: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
4a30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4a40: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
4a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4a60: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4a70: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
4a80: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
4a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4aa0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
4ab0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
4ac0: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
4ad0: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
4ae0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4af0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
4b00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
4b10: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
4b20: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
4b30: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
4b40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4b50: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
4b60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
4b70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4b80: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
4b90: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
4ba0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4bb0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4bc0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
4bd0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4be0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4bf0: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
4c00: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
4c10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4c30: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4c40: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
4c50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4c60: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
4c70: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
4c80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4c90: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4ca0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
4cb0: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
4cc0: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
4cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4ce0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
4cf0: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
4d00: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
4d10: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
4d20: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
4d30: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
4d40: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
4d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
4d60: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
4d70: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
4d80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  endif../*.** Dec
4d90: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
4da0: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
4db0: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
4dc0: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a  b[i] is used..**
4dd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4de0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
4df0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
4e00: 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73   int mask;.  ass
4e10: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
4e20: 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  ->db->nDb );.  a
4e30: 73 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66 28  ssert( i<sizeof(
4e40: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
4e50: 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  );.  mask = 1<<i
4e60: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65  ;.  if( (p->btre
4e70: 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
4e80: 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65   ){.    p->btree
4e90: 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
4ea0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
4eb0: 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26  texArrayInsert(&
4ec0: 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62  p->aMutex, p->db
4ed0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
4ee0: 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e   }.}...#if defin
4ef0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
4f00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
4f10: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
4f20: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
4f30: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
4f40: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
4f50: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
4f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4f70: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
4f80: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
4f90: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
4fa0: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
4fb0: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
4fc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
4fd0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
4fe0: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
4ff0: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
5000: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
5010: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
5020: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
5030: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
5040: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
5050: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
5060: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
5070: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
5080: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
5090: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
50a0: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
50b0: 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20  pOp->p5,.#ifdef 
50c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
50d0: 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74     pOp->zComment
50e0: 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   ? pOp->zComment
50f0: 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20   : "".#else.    
5100: 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b    "".#endif.  );
5110: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
5120: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5130: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
5140: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
5150: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
5160: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
5170: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
5180: 2c 20 69 6e 74 20 66 72 65 65 62 75 66 66 65 72  , int freebuffer
5190: 73 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  s){.  if( p && N
51a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
51b0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
51c0: 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c   int malloc_fail
51d0: 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
51e0: 61 69 6c 65 64 3b 0a 20 20 20 20 77 68 69 6c 65  ailed;.    while
51f0: 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20  ( N-->0 ){.     
5200: 20 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20   assert( N<2 || 
5210: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
5220: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 72   );.      if( fr
5230: 65 65 62 75 66 66 65 72 73 20 29 7b 0a 20 20 20  eebuffers ){.   
5240: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5250: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
5260: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
5280: 65 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61  emReleaseExterna
5290: 6c 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l(p);.      }.  
52a0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d      p->flags = M
52b0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
52c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ++;.    }.    db
52d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
52e0: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a   malloc_failed;.
52f0: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
5300: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
5310: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e  RY_MANAGEMENT.in
5320: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c  t sqlite3VdbeRel
5330: 65 61 73 65 42 75 66 66 65 72 73 28 56 64 62 65  easeBuffers(Vdbe
5340: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a   *p){.  int ii;.
5350: 20 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b    int nFree = 0;
5360: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5370: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5380: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
5390: 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70   for(ii=1; ii<=p
53a0: 2d 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20  ->nMem; ii++){. 
53b0: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
53c0: 70 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20  p->aMem[ii];.   
53d0: 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20   if( pMem->z && 
53e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pMem->flags&MEM_
53f0: 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dyn ){.      ass
5400: 65 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c  ert( !pMem->xDel
5410: 20 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20   );.      nFree 
5420: 2b 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  += sqlite3Malloc
5430: 53 69 7a 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  Size(pMem->z);. 
5440: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5450: 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
5460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5470: 74 75 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65  turn nFree;.}.#e
5480: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
5490: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
54a0: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
54b0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
54c0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
54d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
54e0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
54f0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
5500: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
5510: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
5520: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
5530: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
5540: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
5550: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
5560: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
5570: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
5580: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
5590: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
55a0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
55b0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
55c0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
55d0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
55e0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
55f0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
5600: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
5610: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
5620: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
5630: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
5640: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
5650: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
5660: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
5670: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e  UERY PLAN..*/.in
5680: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
5690: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
56b0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
56c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
56d0: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
56e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
56f0: 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d  TE_OK;.  Mem *pM
5700: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
5710: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
5720: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
5730: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  explain );.  if(
5740: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
5750: 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75  MAGIC_RUN ) retu
5760: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
5770: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
5780: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
5790: 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73  GIC_BUSY );.  as
57a0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
57b0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
57c0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
57d0: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
57e0: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
57f0: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
5800: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
5810: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
5820: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
5830: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
5840: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
5850: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
5860: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
5870: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
5880: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
5890: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
58a0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
58b0: 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  ay(pMem, p->nMem
58c0: 2c 20 31 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20  , 1);..  do{.   
58d0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
58e0: 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70  }while( i<p->nOp
58f0: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
5900: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
5910: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
5920: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  n );.  if( i>=p-
5930: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72  >nOp ){.    p->r
5940: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5950: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
5960: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
5970: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
5980: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
5990: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
59a0: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
59b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
59c0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
59d0: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
59e0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
59f0: 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >rc), (char*)0);
5a00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
5a10: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
5a20: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
5a30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
5a40: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
5a50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5a60: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
5a70: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5a80: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
5a90: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ac0: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
5ad0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
5ae0: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
5af0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
5b00: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
5b10: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
5b20: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
5b30: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
5b40: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
5b50: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
5b60: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
5b70: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
5b80: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
5b90: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
5ba0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5bb0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
5bc0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
5bd0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
5be0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
5bf0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5c00: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
5c10: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
5c40: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
5c50: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5c60: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
5c70: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5c80: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
5c90: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5ca0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5cc0: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
5cd0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5ce0: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5cf0: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
5d00: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
5d10: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5d20: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
5d30: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
5d40: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d60: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
5d70: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5d80: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
5d90: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  pMem++;.    }.. 
5da0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
5db0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
5dc0: 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20  32, 0) ){       
5dd0: 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20       /* P4 */.  
5de0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
5df0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
5e00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5e10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5e20: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5e30: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
5e40: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20  MEM_Term;.    z 
5e50: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
5e60: 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20   pMem->z, 32);. 
5e70: 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e     if( z!=pMem->
5e80: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
5e90: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
5ea0: 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pMem, z, -1, SQL
5eb0: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
5ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
5ed0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5ee0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
5ef0: 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d  >n = strlen(pMem
5f00: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
5f10: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
5f20: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
5f30: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5f40: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
5f50: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
5f60: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
5f70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5f80: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
5f90: 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 4, 0) ){.     
5fa0: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
5fb0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5fc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5fd0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
5fe0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
5ff0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
6000: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
6010: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
6020: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6030: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
6040: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
6050: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
6060: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
6070: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
6080: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
6090: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
60a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
60b0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
60c0: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
60d0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
60e0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
60f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
6100: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
6110: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
6120: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
6130: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c    pMem->n = strl
6140: 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  en(pMem->z);.   
6150: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
6160: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
6170: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
6180: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
6190: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
61a0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61c0: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20  * Comment */.   
61d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
61e0: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20  = SQLITE_NULL;. 
61f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6200: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
6210: 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c  = 8 - 5*(p->expl
6220: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72  ain-1);.    p->r
6230: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6240: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
6250: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
6260: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
6270: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
6280: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
6290: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
62a0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
62b0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
62c0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
62d0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
62e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
62f0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
6300: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
6310: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
6320: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
6330: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
6340: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
6350: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
6360: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
6370: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
6380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
6390: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
63a0: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
63b0: 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20  (u8*)z) ) z++;. 
63c0: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
63d0: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
63e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
63f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6400: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
6410: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
6420: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
6430: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
6440: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
6450: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
6460: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6470: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
6480: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
6490: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
64a0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
64b0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
64c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
64d0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
64e0: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
64f0: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
6500: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
6510: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
6520: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
6530: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
6540: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
6550: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
6560: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
6570: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
6580: 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63 65  for(i=0; isspace
6590: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
65a0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
65b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
65c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
65d0: 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e   isspace((unsign
65e0: 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b  ed char)z[i]) ){
65f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
6600: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
6610: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
6620: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
6630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6640: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
6650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6660: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
6670: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
6680: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
6690: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
66a0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
66b0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
66c0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
66d0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
66e0: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
66f0: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e  e for execution.
6700: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
6710: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
6720: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61  s allocating sta
6730: 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69  ck space and ini
6740: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
6750: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
6760: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
6770: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
6780: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
6790: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
67a0: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
67b0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
67c0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  .  .**.** This i
67d0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
67e0: 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72  o move a VDBE fr
67f0: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  om VDBE_MAGIC_IN
6800: 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  IT to.** VDBE_MA
6810: 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64  GIC_RUN..*/.void
6820: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
6830: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
6840: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
6860: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  DBE */.  int nVa
6870: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
6880: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6890: 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20  r of '?' see in 
68a0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
68b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c  t */.  int nMem,
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
68e0: 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
68f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
6900: 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20   int nCursor,   
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
6930: 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  sors to allocate
6940: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
6950: 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ain             
6960: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6970: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
6980: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
6990: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
69a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
69b0: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
69c0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
69d0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
69e0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
69f0: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
6a00: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
6a10: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
6a20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6a30: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
6a40: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
6a50: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
6a60: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
6a70: 61 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20  ater. This.   * 
6a80: 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
6a90: 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41  all to resizeOpA
6aa0: 72 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79  rray() below may
6ab0: 20 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a   shrink the.   *
6ac0: 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20   p->aOp[] array 
6ad0: 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69  to save memory i
6ae0: 66 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e  f called when in
6af0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
6b00: 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20  .   * state..   
6b10: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
6b20: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
6b30: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63  .  /* For each c
6b40: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20  ursor required, 
6b50: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  also allocate a 
6b60: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d  memory cell. Mem
6b70: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28  ory.  ** cells (
6b80: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e  nMem+1-nCursor).
6b90: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65  .nMem, inclusive
6ba0: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  , will never be 
6bb0: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  used by.  ** the
6bc0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49   vdbe program. I
6bd0: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20  nstead they are 
6be0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
6bf0: 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20   space for.  ** 
6c00: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
6c10: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
6c20: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
6c30: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
6c40: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
6c50: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
6c60: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
6c70: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
6c80: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
6c90: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
6ca0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6cb0: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
6cc0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
6cd0: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
6ce0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
6cf0: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
6d00: 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
6d10: 69 6f 6e 20 73 70 61 63 65 20 66 6f 72 20 72 65  ion space for re
6d20: 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  gisters..  */.  
6d30: 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29  if( p->aMem==0 )
6d40: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20  {.    int nArg; 
6d50: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
6d60: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
6d70: 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72  passed to a user
6d80: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
6d90: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
6da0: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20  s(p, &nArg);.   
6db0: 20 2f 2a 72 65 73 69 7a 65 4f 70 41 72 72 61 79   /*resizeOpArray
6dc0: 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20  (p, p->nOp);*/. 
6dd0: 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e     assert( nVar>
6de0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  =0 );.    if( is
6df0: 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c  Explain && nMem<
6e00: 31 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  10 ){.      p->n
6e10: 4d 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b  Mem = nMem = 10;
6e20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d  .    }.    p->aM
6e30: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
6e40: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20  llocZero(db,.   
6e50: 20 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66       nMem*sizeof
6e60: 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20  (Mem)           
6e70: 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20      /* aMem */. 
6e80: 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65       + nVar*size
6e90: 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20  of(Mem)         
6ea0: 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f        /* aVar */
6eb0: 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69  .      + nArg*si
6ec0: 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20  zeof(Mem*)      
6ed0: 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67          /* apArg
6ee0: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72   */.      + nVar
6ef0: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20  *sizeof(char*)  
6f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a             /* az
6f10: 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Var */.      + n
6f20: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75  Cursor*sizeof(Cu
6f30: 72 73 6f 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a  rsor*) + 1    /*
6f40: 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b   apCsr */.    );
6f50: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
6f60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
6f70: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
6f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
6f90: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
6fa0: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  ..nMem */.      
6fb0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
6fc0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
6fd0: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
6fe0: 2d 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61  -1 */.      p->a
6ff0: 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e  Var = &p->aMem[n
7000: 4d 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d  Mem+1];.      p-
7010: 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20  >nVar = nVar;.  
7020: 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30      p->okVar = 0
7030: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67  ;.      p->apArg
7040: 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56   = (Mem**)&p->aV
7050: 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20  ar[nVar];.      
7060: 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72  p->azVar = (char
7070: 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72  **)&p->apArg[nAr
7080: 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  g];.      p->apC
7090: 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26  sr = (Cursor**)&
70a0: 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a  p->azVar[nVar];.
70b0: 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72        p->nCursor
70c0: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
70d0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
70e0: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; n++){.       
70f0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
7100: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
7110: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
7120: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
7130: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b  }.      for(n=1;
7140: 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a   n<=nMem; n++){.
7150: 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b          p->aMem[
7160: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
7170: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ull;.        p->
7180: 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aMem[n].db = db;
7190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
71a0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
71b0: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31  _DEBUG.  for(n=1
71c0: 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b  ; n<p->nMem; n++
71d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
71e0: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62  ->aMem[n].db==db
71f0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
7200: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
7210: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
7220: 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e  K;.  p->uniqueCn
7230: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f  t = 0;.  p->erro
7240: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
7250: 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e  rt;.  p->explain
7260: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
7270: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
7280: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
7290: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
72a0: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
72b0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
72c0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
72d0: 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65    p->openedState
72e0: 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  ment = 0;.#ifdef
72f0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
7300: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
7310: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7320: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
7330: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
7340: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
7350: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
7360: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7370: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7380: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
7390: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
73a0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
73b0: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
73c0: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
73d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
73e0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
73f0: 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  p, Cursor *pCx){
7400: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
7410: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7420: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
7430: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
7440: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
7450: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
7460: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
7470: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
7480: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
7490: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66  x->pBt);.  }.#if
74a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
74b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
74c0: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
74d0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
74e0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
74f0: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
7500: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
7510: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
7520: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
7530: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
7540: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
7550: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
7560: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
7570: 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20  etyOff(p->db);. 
7580: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
7590: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
75a0: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
75b0: 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62  e3SafetyOn(p->db
75c0: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
75d0: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
75e0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 43  #endif.  if( !pC
75f0: 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61  x->ephemPseudoTa
7600: 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
7610: 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61  e3_free(pCx->pDa
7620: 74 61 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 6d 65  ta);.  }.  /* me
7630: 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a  mset(pCx, 0, siz
7640: 65 6f 66 28 43 75 72 73 6f 72 29 29 3b 20 2a 2f  eof(Cursor)); */
7650: 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72  .  /* sqlite3_fr
7660: 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 20  ee(pCx->aType); 
7670: 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  */.  /* sqlite3_
7680: 66 72 65 65 28 70 43 78 29 3b 20 2a 2f 0a 7d 0a  free(pCx); */.}.
7690: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
76a0: 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20   cursors except 
76b0: 66 6f 72 20 56 54 61 62 20 63 75 72 73 6f 72 73  for VTab cursors
76c0: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
76d0: 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a  tly.** in use..*
76e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
76f0: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63  oseAllCursorsExc
7700: 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28 56  eptActiveVtabs(V
7710: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
7720: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
7730: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7740: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7750: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
7760: 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d   Cursor *pC = p-
7770: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69  >apCsr[i];.    i
7780: 66 28 20 70 43 20 26 26 20 28 21 70 2d 3e 69 6e  f( pC && (!p->in
7790: 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70  VtabMethod || !p
77a0: 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20  C->pVtabCursor) 
77b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
77c0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
77d0: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e  , pC);.      p->
77e0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
77f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7800: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
7810: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
7820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7830: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
7840: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
7850: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
7860: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
7870: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
7880: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
7890: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
78a0: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
78b0: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
78c0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
78d0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
78e0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 66 72  (Vdbe *p, int fr
78f0: 65 65 62 75 66 66 65 72 73 29 7b 0a 20 20 69 6e  eebuffers){.  in
7900: 74 20 69 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  t i;.  closeAllC
7910: 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69  ursorsExceptActi
7920: 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f  veVtabs(p);.  fo
7930: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
7940: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  m; i++){.    Mem
7950: 53 65 74 54 79 70 65 46 6c 61 67 28 26 70 2d 3e  SetTypeFlag(&p->
7960: 61 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c  aMem[i], MEM_Nul
7970: 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  l);.  }.  releas
7980: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
7990: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20  em[1], p->nMem, 
79a0: 66 72 65 65 62 75 66 66 65 72 73 29 3b 0a 20 20  freebuffers);.  
79b0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43  sqlite3VdbeFifoC
79c0: 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b  lear(&p->sFifo);
79d0: 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78  .  if( p->contex
79e0: 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  tStack ){.    fo
79f0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74  r(i=0; i<p->cont
7a00: 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b  extStackTop; i++
7a10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7a20: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
7a30: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69  ->contextStack[i
7a40: 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a  ].sFifo);.    }.
7a50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7a60: 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  (p->contextStack
7a70: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74  );.  }.  p->cont
7a80: 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  extStack = 0;.  
7a90: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44  p->contextStackD
7aa0: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  epth = 0;.  p->c
7ab0: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d  ontextStackTop =
7ac0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
7ad0: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  ee(p->zErrMsg);.
7ae0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
7af0: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
7b00: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
7b10: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
7b20: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
7b30: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
7b40: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
7b50: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
7b60: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
7b70: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
7b80: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
7b90: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
7ba0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
7bb0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
7bc0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
7bd0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
7be0: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
7bf0: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
7c00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
7c10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c20: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
7c30: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
7c40: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
7c50: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
7c60: 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  n;..  releaseMem
7c70: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
7c80: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
7c90: 2a 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a  *COLNAME_N, 1);.
7ca0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7cb0: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
7cc0: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
7cd0: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
7ce0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43  esColumn = nResC
7cf0: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
7d00: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
7d10: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
7d20: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64  bMallocZero(p->d
7d30: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
7d40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
7d50: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
7d60: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
7d70: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
7d80: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
7d90: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
7da0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
7db0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
7dc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
7dd0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
7de0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
7df0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
7e00: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
7e10: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
7e20: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
7e30: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
7e40: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
7e50: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
7e60: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
7e70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7e80: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
7e90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34  ..**.** If N==P4
7ea0: 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e  _STATIC  it mean
7eb0: 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20  s that zName is 
7ec0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
7ed0: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
7ee0: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
7ef0: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
7f00: 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74  e pointer. If it
7f10: 20 69 73 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20   is P4_DYNAMIC, 
7f20: 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72  then .** the str
7f30: 69 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69  ing is freed usi
7f40: 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
7f50: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
7f60: 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  is finished with
7f70: 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73  .** it. Otherwis
7f80: 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e  e, N bytes of zN
7f90: 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a  ame are copied..
7fa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
7fb0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62  beSetColName(Vdb
7fc0: 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69  e *p, int idx, i
7fd0: 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68  nt var, const ch
7fe0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
7ff0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
8000: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
8010: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
8020: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
8030: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
8040: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
8050: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8060: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
8070: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72  E_NOMEM;.  asser
8080: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
8090: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
80a0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
80b0: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
80c0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e  olumn]);.  if( N
80d0: 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20  ==P4_DYNAMIC || 
80e0: 4e 3d 3d 50 34 5f 53 54 41 54 49 43 20 29 7b 0a  N==P4_STATIC ){.
80f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8100: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
8110: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
8120: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8130: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
8150: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
8160: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
8170: 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54   zName, N, SQLIT
8180: 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52  E_UTF8,SQLITE_TR
8190: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
81a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
81b0: 4b 20 26 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d  K && N==P4_DYNAM
81c0: 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61  IC ){.    pColNa
81d0: 6d 65 2d 3e 66 6c 61 67 73 20 26 3d 20 28 7e 4d  me->flags &= (~M
81e0: 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EM_Static);.    
81f0: 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61 6c 6c 6f  pColName->zMallo
8200: 63 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 3b  c = pColName->z;
8210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
8230: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
8240: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
8250: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
8260: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
8270: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
8280: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
8290: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
82a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
82b0: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
82c0: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
82d0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
82e0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
82f0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
8300: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
8310: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
8320: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
8330: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
8340: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
8350: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
8360: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
8370: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
8380: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
8390: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
83a0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
83b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
83c0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
83d0: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
83e0: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
83f0: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
8400: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
8410: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
8420: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
8430: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
8440: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
8450: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
8460: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
8470: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
8480: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
8490: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
84a0: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
84b0: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
84c0: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
84d0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
84e0: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
84f0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
8500: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
8510: 63 28 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28  c(db, rc);.  if(
8520: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
8550: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
8560: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
8570: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
8580: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
8590: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
85a0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
85b0: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
85c0: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
85d0: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
85e0: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
85f0: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
8600: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
8610: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
8620: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
8630: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
8640: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
8650: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
8660: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
8670: 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
8680: 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
8690: 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  / .  for(i=0; i<
86a0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
86b0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
86c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
86d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
86e0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
86f0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
8700: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
8710: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
8720: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Trans++;.    }. 
8730: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
8740: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
8750: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
8760: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
8770: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
8780: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
8790: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
87a0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28  allback ){.    (
87b0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
87c0: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
87d0: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
87e0: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
87f0: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f  mitArg);.    (vo
8800: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
8810: 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  On(db);.    if( 
8820: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
8830: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
8840: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  AINT;.    }.  }.
8850: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
8860: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
8870: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
8880: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
8890: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
88a0: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
88b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
88c0: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
88d0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
88e0: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
88f0: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
8900: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
8910: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
8920: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
8930: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
8940: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
8950: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
8960: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
8970: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
8980: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
8990: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
89a0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
89b0: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
89c0: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
89d0: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
89e0: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
89f0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72   */.  if( 0==str
8a00: 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  len(sqlite3Btree
8a10: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
8a20: 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20  aDb[0].pBt)) || 
8a30: 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20  nTrans<=1 ){.   
8a40: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
8a50: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
8a60: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
8a70: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8a80: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8a90: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
8aa0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
8ab0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
8ac0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
8ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8ae0: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
8af0: 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
8b00: 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
8b10: 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
8b20: 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
8b30: 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
8b40: 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
8b50: 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
8b60: 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
8b70: 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
8b80: 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
8b90: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
8ba0: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
8bb0: 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
8bc0: 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
8bd0: 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
8be0: 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
8bf0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
8c00: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
8c10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8c20: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
8c30: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
8c40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
8c50: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8c60: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
8c70: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
8c80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8c90: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8ca0: 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20  Two(pBt);.      
8cb0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
8ce0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
8cf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
8d00: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
8d10: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
8d20: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
8d30: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
8d40: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
8d50: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
8d60: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
8d70: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
8d80: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
8d90: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
8da0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
8db0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
8dc0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
8dd0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
8de0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
8df0: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
8e00: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
8e10: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
8e20: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
8e30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
8e40: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
8e50: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
8e60: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
8e70: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
8e80: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
8e90: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
8ea0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
8eb0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
8ec0: 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  res;..    /* Sel
8ed0: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
8ee0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
8ef0: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
8f00: 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20   u32 random;.   
8f10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8f20: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
8f30: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
8f40: 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  ss(sizeof(random
8f50: 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20  ), &random);.   
8f60: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
8f70: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8f80: 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61  "%s-mj%08X", zMa
8f90: 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30  inFile, random&0
8fa0: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  x7fffffff);.    
8fb0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
8fc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8fd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8fe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
8ff0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
9000: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
9010: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
9020: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
9030: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
9040: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
9050: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9060: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9070: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
9080: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
9090: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
90a0: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
90b0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
90c0: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
90d0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
90e0: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
90f0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
9100: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
9110: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
9120: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
9130: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
9140: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
9150: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9160: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9170: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
9180: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
9190: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
91a0: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
91b0: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
91c0: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
91d0: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
91e0: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
91f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9200: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
9210: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
9220: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
9230: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
9240: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9250: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
9260: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
9270: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
9280: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
9290: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
92a0: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
92b0: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
92c0: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
92d0: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
92e0: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
92f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
9300: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9310: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
9320: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
9330: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  pBt;.      if( i
9340: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==1 ) continue; 
9350: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
9360: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
9370: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9380: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
9390: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
93a0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
93b0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
93c0: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
93d0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
93e0: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
93f0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
9400: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
9410: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
9420: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
9430: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
9440: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
9450: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
9460: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
9470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9480: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9490: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
94a0: 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  le, strlen(zFile
94b0: 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
94c0: 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
94d0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b  strlen(zFile)+1;
94e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
94f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
9510: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
9520: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
9530: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
9540: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
9550: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9560: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
9570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
9580: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
9590: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
95a0: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
95b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
95c0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
95d0: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
95e0: 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
95f0: 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
9600: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
9610: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69    */.    zMainFi
9620: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
9630: 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e  eGetDirname(db->
9640: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
9650: 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a   if( (needSync .
9660: 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c       && (0==(sql
9670: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
9680: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
9690: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
96a0: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20  P_SEQUENTIAL)). 
96b0: 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74      && (rc=sqlit
96c0: 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
96d0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
96e0: 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f  RMAL))!=SQLITE_O
96f0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  K) ){.      sqli
9700: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
9710: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
9720: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
9730: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
9740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9750: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
9760: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9770: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
9780: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
9790: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
97a0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
97b0: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
97c0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
97d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
97e0: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
97f0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
9800: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
9810: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
9820: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
9830: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9840: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
9850: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
9860: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
9870: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
9880: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
9890: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
98a0: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
98b0: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
98c0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
98d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
98e0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
98f0: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
9900: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
9910: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
9920: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9930: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
9940: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9950: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
9960: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
9970: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a  ailure occured..
9980: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
9990: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
99a0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
99b0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
99c0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
99d0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
99e0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
99f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
9a00: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
9a10: 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
9a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9a30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9a40: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
9a50: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
9a60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9a70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
9a80: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
9a90: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
9aa0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
9ab0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9ac0: 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
9ad0: 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
9ae0: 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
9af0: 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
9b00: 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
9b10: 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
9b20: 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
9b30: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
9b40: 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
9b50: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
9b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
9b70: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
9b80: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
9b90: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
9ba0: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
9bb0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
9bc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9bd0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
9be0: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
9bf0: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
9c00: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
9c10: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
9c20: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
9c30: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
9c40: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
9c50: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
9c60: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
9c70: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
9c80: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
9c90: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
9ca0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
9cb0: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
9cc0: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
9cd0: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
9ce0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
9cf0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
9d00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
9d10: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
9d20: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
9d30: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
9d40: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
9d50: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
9d60: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
9d70: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
9d80: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
9d90: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
9da0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
9db0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
9dc0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9dd0: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
9de0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9df0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
9e00: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
9e10: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
9e20: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
9e30: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9e40: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
9e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9e60: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
9e70: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
9e80: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
9e90: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
9ea0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
9eb0: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
9ec0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
9ed0: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
9ee0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
9ef0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
9f00: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
9f10: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
9f20: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
9f30: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
9f40: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
9f50: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
9f60: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
9f70: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
9f80: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
9f90: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
9fa0: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
9fb0: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
9fc0: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
9fd0: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
9fe0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
9ff0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
a000: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
a010: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
a020: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
a030: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
a040: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
a050: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
a060: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
a070: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
a080: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
a090: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
a0a0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
a0b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
a0c0: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
a0d0: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
a0e0: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
a0f0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
a100: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
a110: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  tiveVdbeCnt );.}
a120: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
a130: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
a140: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
a150: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
a160: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
a170: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
a180: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
a190: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
a1a0: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
a1b0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
a1c0: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
a1d0: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
a1e0: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
a1f0: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
a200: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
a210: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
a220: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
a230: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
a240: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
a250: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
a260: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
a270: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
a280: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
a290: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
a2a0: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
a2b0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
a2c0: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
a2d0: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
a2e0: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
a2f0: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
a300: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
a310: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
a320: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
a330: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
a340: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
a350: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
a360: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
a370: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
a380: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
a390: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
a3a0: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
a3b0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
a3c0: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
a3d0: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
a3e0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
a3f0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
a400: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
a410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
a420: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
a430: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
a440: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
a450: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
a460: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a470: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
a480: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
a490: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
a4a0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
a4b0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
a4c0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
a4d0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
a4e0: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
a4f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a510: 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
a520: 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
a530: 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
a540: 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
a550: 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
a560: 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
a570: 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
a580: 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
a590: 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
a5a0: 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
a5b0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
a5c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a5d0: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
a5e0: 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
a5f0: 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
a600: 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
a610: 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
a620: 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
a630: 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
a640: 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
a650: 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
a660: 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
a670: 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
a680: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
a690: 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
a6a0: 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
a6b0: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
a6c0: 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
a6d0: 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
a6e0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
a6f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
a700: 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
a710: 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
a720: 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
a730: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
a740: 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
a750: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
a760: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
a770: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
a780: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a790: 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a  (*xFunc)(Btree *
a7a0: 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75  pBt) = 0;  /* Fu
a7b0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f  nction to call o
a7c0: 6e 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63  n each btree bac
a7d0: 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  kend */.  int is
a7e0: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
a7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
a800: 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54  to true if SQLIT
a810: 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52  E_NOMEM or IOERR
a820: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
a830: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
a840: 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
a850: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
a860: 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
a870: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
a880: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
a890: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
a8a0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
a8b0: 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
a8c0: 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
a8d0: 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
a8e0: 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
a8f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
a900: 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
a910: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
a920: 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
a930: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
a940: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
a950: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
a960: 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
a970: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
a980: 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
a990: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
a9a0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
a9b0: 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
a9c0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
a9d0: 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
a9e0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
a9f0: 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
aa00: 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
aa10: 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
aa20: 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
aa30: 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
aa40: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
aa50: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
aa60: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
aa70: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
aa80: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  OMEM;.  }.  clos
aa90: 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70  eAllCursorsExcep
aaa0: 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b  tActiveVtabs(p);
aab0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
aac0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
aad0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
aae0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
aaf0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
ab00: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
ab10: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
ab20: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
ab30: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
ab40: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
ab50: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
ab60: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
ab70: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
ab80: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a   from p->rc */..
ab90: 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
aba0: 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
abb0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
abc0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
abd0: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
abe0: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20  &p->aMutex);..  
abf0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
ac00: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
ac10: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
ac20: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
ac30: 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
ac40: 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
ac50: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
ac60: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
ac90: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
aca0: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
acb0: 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
acc0: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
acd0: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
ace0: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
acf0: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
ad00: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
ad10: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
ad20: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
ad30: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
ad40: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
ad50: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
ad60: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
ad70: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
ad80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ad90: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  al.      **     
ada0: 51 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74  Query without st
adb0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
adc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
add0: 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f  * We could do so
ade0: 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65  mething more ele
adf0: 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73  gant than this s
ae00: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28  tatic analysis (
ae10: 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  i.e..      ** st
ae20: 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ore the type of 
ae30: 71 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66  query as part of
ae40: 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e   the compliation
ae50: 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20   phase), but .  
ae60: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20      ** handling 
ae70: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
ae80: 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72  ailure is a fair
ae90: 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20  ly obscure edge 
aea0: 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a  case so .      *
aeb0: 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62  * this is probab
aec0: 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a  ly easier. Todo:
aed0: 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70   Might be an opp
aee0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75  ortunity to redu
aef0: 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ce .      ** cod
af00: 65 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d  e size a very sm
af10: 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67  all amount thoug
af20: 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  h....      */.  
af30: 20 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f      int notReadO
af40: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  nly = 0;.      i
af50: 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d  nt isStatement =
af60: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
af70: 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f  (p->aOp || p->nO
af80: 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p==0);.      for
af90: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
afa0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73  i++){ .        s
afb0: 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d  witch( p->aOp[i]
afc0: 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  .opcode ){.     
afd0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
afe0: 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20  nsaction:.      
aff0: 20 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c        notReadOnl
b000: 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  y |= p->aOp[i].p
b010: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  2;.            b
b020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b030: 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e  case OP_Statemen
b040: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t:.            i
b050: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a  sStatement = 1;.
b060: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b070: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
b080: 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20     }..   .      
b090: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
b0a0: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
b0b0: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
b0c0: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
b0d0: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
b0e0: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
b0f0: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
b100: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
b110: 20 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f      if( notReadO
b120: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
b130: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
b140: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
b150: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
b160: 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61  BLOCKED && isSta
b170: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
b180: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
b190: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
b1a0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
b1b0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
b1c0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
b1d0: 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51  lse if( (mrc==SQ
b1e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
b1f0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
b200: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
b210: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b220: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b230: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
b240: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b250: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
b260: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
b270: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
b280: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
b290: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
b2a0: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
b2b0: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
b2c0: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
b2d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
b2e0: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
b2f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
b300: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
b310: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b320: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
b330: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
b340: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
b350: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
b360: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b380: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
b390: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
b3a0: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
b3b0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
b3c0: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
b3d0: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
b3e0: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
b3f0: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
b400: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
b410: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
b420: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
b430: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
b440: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
b450: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
b460: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
b470: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
b480: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
b490: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
b4a0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b4b0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
b4c0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b4d0: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
b4e0: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
b4f0: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
b500: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
b510: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
b520: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
b530: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
b540: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
b550: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
b560: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
b570: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
b580: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
b590: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
b5a0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
b5b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
b5c0: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
b5d0: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  t(db);.        i
b5e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
b5f0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
b600: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
b610: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
b620: 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
b630: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b640: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
b650: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
b660: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b670: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b680: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b690: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b6a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b6c0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
b6d0: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
b6e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b6f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b700: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b710: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
b720: 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63  }else if( !xFunc
b730: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
b740: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
b750: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
b760: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
b770: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
b780: 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  edStatement ){. 
b790: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
b7a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
b7b0: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  mitStmt;.       
b7c0: 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   } .      }else 
b7d0: 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
b7e0: 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
b7f0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
b800: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b810: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
b820: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
b830: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
b840: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b850: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
b860: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
b870: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
b880: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
b890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b8a0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
b8b0: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
b8c0: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
b8d0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
b8e0: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
b8f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
b900: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
b910: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
b920: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
b930: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
b940: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
b950: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
b960: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
b970: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
b980: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
b990: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
b9a0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b9b0: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
b9c0: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
b9d0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
b9e0: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
b9f0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
ba00: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
ba10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
ba20: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
ba30: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
ba40: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
ba50: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ba60: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ba70: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ba80: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
ba90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
baa0: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
bab0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
bac0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
bad0: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
bae0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
baf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
bb00: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
bb10: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
bb20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
bb30: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
bb40: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
bb50: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
bb60: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
bb70: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
bb80: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
bb90: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
bba0: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
bbb0: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
bbc0: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
bbd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
bbe0: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
bbf0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
bc00: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
bc10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
bc20: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
bc30: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
bc40: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
bc50: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
bc60: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
bc70: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
bc80: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
bc90: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
bca0: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
bcb0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
bcc0: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
bcd0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
bce0: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
bcf0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
bd00: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
bd10: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
bd20: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
bd30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
bd40: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
bd50: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
bd60: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
bd70: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
bd80: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
bd90: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
bda0: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
bdb0: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
bdc0: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
bdd0: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
bde0: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
bdf0: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
be00: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
be10: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
be20: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
be30: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
be40: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
be50: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
be60: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
be70: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
be80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
be90: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
bea0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
beb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bec0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
bed0: 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
bee0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
bef0: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
bf00: 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
bf10: 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
bf20: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
bf30: 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
bf40: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
bf50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
bf60: 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
bf70: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
bf80: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
bf90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
bfa0: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
bfb0: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
bfc0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
bfd0: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
bfe0: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
bff0: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
c000: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
c010: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
c020: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
c030: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
c040: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
c050: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
c060: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
c070: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
c080: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
c090: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
c0a0: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
c0b0: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
c0c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
c0d0: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
c0e0: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
c0f0: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
c100: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
c110: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c120: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
c130: 2c 20 69 6e 74 20 66 72 65 65 62 75 66 66 65 72  , int freebuffer
c140: 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  s){.  sqlite3 *d
c150: 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
c160: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
c170: 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
c180: 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
c190: 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
c1a0: 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
c1b0: 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
c1c0: 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
c1d0: 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
c1e0: 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
c1f0: 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73  ..  */.  (void)s
c200: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
c210: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
c220: 65 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69  eHalt(p);.  (voi
c230: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
c240: 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ff(db);..  /* If
c250: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
c260: 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
c270: 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
c280: 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
c290: 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
c2a0: 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
c2b0: 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
c2c0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
c2d0: 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
c2e0: 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
c2f0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
c300: 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
c310: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
c320: 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
c330: 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
c340: 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
c350: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
c360: 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
c370: 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
c380: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
c390: 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
c3a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c3b0: 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
c3c0: 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d  pErr,-1,p->zErrM
c3d0: 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 73  sg,SQLITE_UTF8,s
c3e0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
c3f0: 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
c400: 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70  = p->rc;.      p
c410: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
c420: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
c430: 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
c440: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
c450: 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
c460: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
c470: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
c480: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
c490: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
c4a0: 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
c4b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
c4c0: 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
c4d0: 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
c4e0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
c4f0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
c500: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
c510: 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
c520: 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
c530: 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
c540: 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
c550: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
c560: 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
c570: 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
c580: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
c590: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
c5a0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
c5b0: 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
c5c0: 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
c5d0: 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65  ITE_UTF8, sqlite
c5e0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 70 2d 3e  3_free);.    p->
c5f0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
c600: 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
c610: 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
c620: 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
c630: 20 20 43 6c 65 61 6e 75 70 28 70 2c 20 66 72 65    Cleanup(p, fre
c640: 65 62 75 66 66 65 72 73 29 3b 0a 0a 20 20 2f 2a  ebuffers);..  /*
c650: 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
c660: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
c670: 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
c680: 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
c690: 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
c6a0: 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
c6b0: 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
c6c0: 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
c6d0: 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
c6e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
c6f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
c700: 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
c710: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
c720: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
c730: 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
c740: 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
c750: 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
c760: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
c770: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  "\n");.      for
c780: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
c790: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
c7a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20  rintf(out, "%6d 
c7b0: 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a  %10lld %8lld ",.
c7c0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
c7d0: 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
c7e0: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
c7f0: 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
c800: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
c810: 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
c820: 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
c830: 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
c840: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c850: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
c860: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
c870: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c880: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
c890: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c8a0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
c8b0: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d  MAGIC_INIT;.  p-
c8c0: 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20  >aborted = 0;.  
c8d0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
c8e0: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
c8f0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
c900: 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
c910: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
c920: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
c930: 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
c940: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
c950: 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
c960: 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
c970: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
c980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c990: 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
c9a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
c9b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
c9c0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
c9d0: 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
c9e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
c9f0: 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
ca00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
ca10: 73 65 74 28 70 2c 20 31 29 3b 0a 20 20 20 20 61  set(p, 1);.    a
ca20: 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
ca30: 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
ca40: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
ca50: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
ca60: 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20  AGIC_INIT ){.   
ca70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
ca80: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65 6c  ISUSE;.  }.  rel
ca90: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
caa0: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
cab0: 6d 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, 1);.  sqlite3
cac0: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
cad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cae0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
caf0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
cb00: 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
cb10: 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
cb20: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
cb30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
cb40: 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
cb50: 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
cb60: 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
cb70: 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
cb80: 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
cb90: 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
cba0: 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
cbb0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
cbc0: 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
cbd0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
cbe0: 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
cbf0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
cc00: 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
cc10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
cc20: 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
cc30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
cc40: 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
cc50: 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
cc60: 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
cc70: 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
cc80: 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75  &(1<<i))) && pAu
cc90: 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
cca0: 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
ccb0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
ccc0: 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
ccd0: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
cce0: 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
ccf0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
cd00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
cd10: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
cd20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cd30: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
cd40: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
cd50: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
cd60: 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 2c 20  n;.  Cleanup(p, 
cd70: 31 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  1);.  if( p->pPr
cd80: 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
cd90: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
cda0: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
cdb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
cdc0: 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
cdd0: 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d    p->db->pVdbe =
cde0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
cdf0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
ce00: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
ce10: 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
ce20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
ce30: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
ce40: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66   = p->aOp;.    f
ce50: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
ce60: 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i++, pOp++){. 
ce70: 20 20 20 20 20 66 72 65 65 50 34 28 70 4f 70 2d       freeP4(pOp-
ce80: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
ce90: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
cea0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73  TE_DEBUG.      s
ceb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 2d  qlite3_free(pOp-
cec0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
ced0: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
cee0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cef0: 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ->aOp);.  }.  re
cf00: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
cf10: 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 2c 20  >aVar, p->nVar, 
cf20: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
cf30: 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  ee(p->aLabel);. 
cf40: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
cf50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
cf60: 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20  (&p->aMem[1]);. 
cf70: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
cf80: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
cf90: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
cfa0: 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20  COLNAME_N, 1);. 
cfb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
cfc0: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
cfd0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53  lite3_free(p->zS
cfe0: 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ql);.  p->magic 
cff0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
d000: 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  D;.  sqlite3_fre
d010: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(p);.}../*.** I
d020: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
d030: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
d040: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
d050: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
d060: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
d070: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
d080: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
d090: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
d0a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
d0b0: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
d0c0: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
d0d0: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
d0e0: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
d0f0: 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b  veto(Cursor *p){
d100: 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
d110: 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
d120: 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
d130: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
d140: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
d150: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
d160: 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
d170: 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
d180: 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
d190: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
d1a0: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
d1b0: 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
d1c0: 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
d1d0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d1e0: 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70  rn rc;.    *p->p
d1f0: 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20  IncrKey = 0;.   
d200: 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20   p->lastRowid = 
d210: 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65  keyToInt(p->move
d220: 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70  toTarget);.    p
d230: 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
d240: 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28   res==0;.    if(
d250: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
d260: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d270: 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72  eNext(p->pCursor
d280: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69  , &res);.      i
d290: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d2a0: 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  c;.    }.#ifdef 
d2b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
d2c0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
d2d0: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
d2e0: 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
d2f0: 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
d300: 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
d310: 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a  ACHE_STALE;.  }.
d320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d330: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
d340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
d350: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
d360: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d370: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
d380: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
d390: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
d3a0: 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20  SerialRead().** 
d3b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d3c0: 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
d3d0: 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65  3VdbeSerialWrite
d3e0: 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
d3f0: 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
d400: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
d410: 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
d420: 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
d430: 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
d440: 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
d450: 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
d460: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
d470: 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
d480: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
d490: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
d4a0: 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
d4b0: 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
d4c0: 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
d4d0: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
d4e0: 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
d4f0: 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
d500: 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
d510: 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
d520: 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
d530: 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
d540: 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
d550: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
d560: 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
d570: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
d580: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
d590: 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
d5a0: 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
d5b0: 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
d5c0: 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
d5d0: 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
d5e0: 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
d5f0: 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
d600: 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
d610: 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
d620: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d630: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
d640: 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
d650: 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
d660: 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
d670: 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
d680: 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
d690: 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
d6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
d6b0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d6c0: 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
d6d0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d700: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
d730: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
d740: 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
d760: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
d770: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
d780: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
d790: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
d7a0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
d7b0: 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
d7e0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
d7f0: 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
d800: 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
d810: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
d820: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
d850: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
d860: 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
d880: 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
d890: 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
d8c0: 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
d8d0: 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d900: 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
d910: 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
d940: 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
d950: 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
d960: 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
d970: 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
d980: 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
d990: 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
d9a0: 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
d9b0: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
d9c0: 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
d9d0: 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
d9e0: 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
d9f0: 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
da00: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
da10: 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
da20: 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
da30: 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
da40: 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
da50: 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
da60: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
da70: 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
da80: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
da90: 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
daa0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
dab0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
dac0: 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
dad0: 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
dae0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
daf0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
db00: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
db10: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
db20: 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
db30: 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
db40: 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
db50: 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
db60: 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
db70: 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
db80: 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
db90: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
dba0: 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
dbb0: 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
dbc0: 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
dbd0: 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d  eturn 8+i;.    }
dbe0: 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d  .    u = i<0 ? -
dbf0: 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75  i : i;.    if( u
dc00: 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
dc10: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
dc20: 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
dc30: 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
dc40: 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
dc50: 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
dc60: 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
dc70: 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
dc80: 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
dc90: 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
dca0: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
dcb0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
dcc0: 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
dcd0: 73 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d 45  ssert( flags&(ME
dce0: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
dcf0: 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e  );.  n = pMem->n
dd00: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
dd10: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
dd20: 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a  n += pMem->u.i;.
dd30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e    }.  assert( n>
dd40: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
dd50: 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
dd60: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
dd70: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
dd80: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
dd90: 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
dda0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
ddb0: 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
ddc0: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
ddd0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
dde0: 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
ddf0: 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
de00: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
de10: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
de20: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
de30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
de40: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
de50: 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
de60: 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
de70: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
de80: 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
de90: 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
dea0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
deb0: 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
dec0: 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
ded0: 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
dee0: 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
def0: 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
df00: 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
df10: 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
df20: 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
df30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
df40: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
df50: 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
df60: 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
df70: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
df80: 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
df90: 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
dfa0: 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
dfb0: 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
dfc0: 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
dfd0: 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
dfe0: 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
dff0: 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
e000: 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
e010: 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
e020: 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
e030: 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
e040: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
e050: 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
e060: 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
e070: 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
e080: 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
e090: 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
e0a0: 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
e0b0: 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
e0c0: 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
e0d0: 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
e0e0: 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
e0f0: 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
e100: 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
e110: 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
e120: 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
e130: 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
e140: 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
e150: 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
e160: 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
e170: 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
e180: 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
e190: 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
e1a0: 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
e1b0: 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
e1c0: 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
e1d0: 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
e1e0: 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
e1f0: 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
e200: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
e210: 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
e220: 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
e230: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
e240: 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
e250: 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
e260: 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
e270: 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
e280: 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
e290: 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
e2a0: 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
e2b0: 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
e2c0: 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
e2d0: 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
e2e0: 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
e2f0: 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
e300: 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
e310: 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
e320: 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
e330: 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
e340: 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
e350: 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
e360: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
e370: 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
e380: 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
e390: 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
e3a0: 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
e3b0: 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
e3c0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
e3d0: 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
e3e0: 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
e3f0: 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
e400: 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
e410: 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
e420: 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
e430: 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
e440: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
e450: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
e460: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
e470: 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
e480: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
e490: 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
e4a0: 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
e4b0: 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
e4c0: 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
e4d0: 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
e4e0: 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
e4f0: 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
e500: 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
e510: 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
e520: 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
e530: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
e540: 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
e550: 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
e560: 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
e570: 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
e580: 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
e590: 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
e5a0: 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
e5b0: 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
e5c0: 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
e5d0: 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
e5e0: 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
e5f0: 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
e600: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e610: 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
e620: 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
e630: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
e640: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
e650: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
e660: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
e670: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
e680: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
e690: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
e6a0: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
e6b0: 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
e6c0: 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
e6d0: 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
e6e0: 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
e6f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
e700: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
e710: 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
e720: 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
e730: 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75  t in buf[].  nBu
e740: 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  f must always be
e750: 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  .** large enough
e760: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
e770: 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65  ire field.  Exce
e780: 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64  pt, if the field
e790: 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69   is.** a blob wi
e7a0: 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  th a zero-filled
e7b0: 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b   tail, then buf[
e7c0: 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20  ] might be just 
e7d0: 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a  the right.** siz
e7e0: 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74  e to hold everyt
e7f0: 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20  hing except for 
e800: 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
e810: 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a  tail.  If buf[].
e820: 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65  ** is only big e
e830: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
e840: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69  e non-zero prefi
e850: 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  x, then only wri
e860: 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69  te that.** prefi
e870: 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42  x into buf[].  B
e880: 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c  ut if buf[] is l
e890: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
e8a0: 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20  old both the.** 
e8b0: 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74  prefix and the t
e8c0: 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74  ail then write t
e8d0: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65  he prefix and se
e8e0: 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c  t the tail to al
e8f0: 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a  l.** zeros..**.*
e900: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
e910: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
e920: 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
e930: 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
e940: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
e950: 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
e960: 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
e970: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
e980: 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
e990: 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
e9a0: 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
e9b0: 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73  buf[]..*/ .int s
e9c0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e9d0: 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74  Put(u8 *buf, int
e9e0: 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   nBuf, Mem *pMem
e9f0: 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
ea00: 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c  t){.  u32 serial
ea10: 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
ea20: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d  dbeSerialType(pM
ea30: 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  em, file_format)
ea40: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20  ;.  int len;..  
ea50: 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
ea60: 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
ea70: 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
ea80: 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
ea90: 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69      u64 v;.    i
eaa0: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  nt i;.    if( se
eab0: 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
eac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
ead0: 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
eae0: 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
eaf0: 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
eb00: 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
eb10: 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
eb20: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
eb30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eb40: 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
eb50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
eb60: 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
eb70: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
eb80: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
eb90: 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42   assert( len<=nB
eba0: 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  uf );.    while(
ebb0: 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
ebc0: 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b  f[i] = (v&0xFF);
ebd0: 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
ebe0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
ebf0: 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
ec00: 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
ec10: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
ec20: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
ec30: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
ec40: 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
ec50: 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
ec60: 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20  >u.i:0).        
ec70: 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56       == sqlite3V
ec80: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
ec90: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
eca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
ecb0: 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
ecc0: 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
ecd0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
ece0: 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
ecf0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
ed00: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
ed10: 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
ed20: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Mem->u.i;.      
ed30: 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a  if( len>nBuf ){.
ed40: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42          len = nB
ed50: 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  uf;.      }.    
ed60: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d    memset(&buf[pM
ed70: 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70  em->n], 0, len-p
ed80: 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20  Mem->n);.    }. 
ed90: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
eda0: 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
edb0: 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
edc0: 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
edd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
ede0: 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
edf0: 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
ee00: 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
ee10: 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
ee20: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
ee30: 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
ee40: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
ee50: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
ee60: 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ad..*/ .int sqli
ee70: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
ee80: 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
ee90: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
eea0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
eeb0: 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
eec0: 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
eed0: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
eee0: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
eef0: 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
ef00: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
ef30: 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
ef40: 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
ef50: 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
ef60: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
ef70: 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
ef80: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
ef90: 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
efa0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
efb0: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
efc0: 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
efd0: 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
efe0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
eff0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
f000: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f010: 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
f020: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
f030: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
f040: 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63  >u.i = (signed c
f050: 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20  har)buf[0];.    
f060: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f070: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
f080: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
f090: 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
f0a0: 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
f0b0: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
f0c0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
f0d0: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
f0e0: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
f0f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f100: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
f110: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
f120: 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
f130: 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
f140: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
f150: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
f160: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
f170: 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
f180: 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
f190: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f1a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f1b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
f1c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
f1d0: 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
f1e0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f1f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f200: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
f210: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
f220: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
f230: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
f240: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f250: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
f260: 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
f270: 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
f280: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
f290: 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
f2a0: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
f2b0: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
f2c0: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
f2d0: 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
f2e0: 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
f2f0: 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
f300: 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
f310: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
f320: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
f330: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
f340: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f350: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
f360: 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
f370: 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
f380: 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
f390: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
f3a0: 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
f3b0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
f3c0: 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
f3d0: 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
f3e0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
f3f0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
f400: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
f410: 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
f420: 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
f430: 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
f440: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
f450: 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
f460: 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
f470: 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
f480: 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
f490: 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
f4a0: 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e  s.      ** defin
f4b0: 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
f4c0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
f4d0: 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
f4e0: 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65  mixed.      ** e
f4f0: 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndian..      */.
f500: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
f510: 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
f520: 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
f530: 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  2;.      static 
f540: 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
f550: 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34  = 1.0;.      u64
f560: 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20   t2 = t1;.      
f570: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
f580: 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20  loat(t2);.      
f590: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
f5a0: 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
f5b0: 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
f5c0: 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
f5d0: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  0 );.#endif..   
f5e0: 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c     x = (buf[0]<<
f5f0: 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
f600: 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
f610: 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
f620: 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34   y = (buf[4]<<24
f630: 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29  ) | (buf[5]<<16)
f640: 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c   | (buf[6]<<8) |
f650: 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78   buf[7];.      x
f660: 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
f670: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
f680: 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
f690: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
f6a0: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
f6b0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f6c0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
f6e0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
f6f0: 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
f700: 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  em->r)==8 );.   
f710: 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
f720: 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
f730: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d        memcpy(&pM
f740: 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
f750: 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70  f(x));.        p
f760: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
f770: 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
f780: 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
f790: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
f7a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
f7b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f7c0: 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
f7d0: 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
f7e0: 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
f7f0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
f800: 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
f810: 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
f820: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f830: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f840: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
f850: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
f860: 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c  nt len = (serial
f870: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
f880: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
f890: 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
f8a0: 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20  pMem->n = len;. 
f8b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
f8c0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
f8d0: 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
f8e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
f8f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
f900: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
f910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f920: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f930: 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
f940: 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  Ephem;.      }. 
f950: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b       return len;
f960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f970: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
f980: 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
f990: 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
f9a0: 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
f9b0: 79 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a  y[], parse the.*
f9c0: 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20  * record into a 
f9d0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
f9e0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
f9f0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
fa00: 2a 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  * that structure
fa10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
fa20: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67  ing function mig
fa30: 68 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61  ht provide szSpa
fa40: 63 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ce bytes of memo
fa50: 72 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70  ry.** space at p
fa60: 53 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61  Space.  This spa
fa70: 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ce can be used t
fa80: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
fa90: 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65  ned.** VDbeParse
faa0: 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
fab0: 65 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65  e if it is large
fac0: 20 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20   enough.  If it 
fad0: 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e  is.** not big en
fae0: 6f 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f  ough, space is o
faf0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
fb00: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
fb10: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
fb20: 64 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  d structure shou
fb30: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20  ld be closed by 
fb40: 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  a call to.** sql
fb50: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
fb60: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a  packedRecord()..
fb70: 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  */ .UnpackedReco
fb80: 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52  rd *sqlite3VdbeR
fb90: 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
fba0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
fbb0: 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
fbc0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
fbd0: 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
fbe0: 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
fbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fc00: 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
fc10: 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
fc20: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
fc30: 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
fc40: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 76 6f 69 64  record */.  void
fc50: 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
fc60: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69     /* Space avai
fc70: 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65  lable to hold re
fc80: 73 75 6c 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a  sulting object *
fc90: 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20  /.  int szSpace 
fca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fcb0: 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
fcc0: 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
fcd0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
fce0: 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
fcf0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
fd00: 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63   *)pKey;.  Unpac
fd10: 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20  kedRecord *p;.  
fd20: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
fd30: 20 69 2c 20 69 64 78 2c 20 64 3b 0a 20 20 75 33   i, idx, d;.  u3
fd40: 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a  2 szHdr;.  Mem *
fd50: 70 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72  pMem;.  .  asser
fd60: 74 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73  t( sizeof(Mem)>s
fd70: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e  izeof(*p) );.  n
fd80: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65  Byte = sizeof(Me
fd90: 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
fda0: 69 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e  ield+2);.  if( n
fdb0: 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a  Byte>szSpace ){.
fdc0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
fdd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
fde0: 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
fdf0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
fe00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d  return 0;.    p-
fe10: 3e 6e 65 65 64 46 72 65 65 20 3d 20 31 3b 0a 20  >needFree = 1;. 
fe20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
fe30: 70 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 6e  pSpace;.    p->n
fe40: 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
fe50: 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
fe60: 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
fe70: 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
fe80: 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
fe90: 20 70 2d 3e 6e 65 65 64 44 65 73 74 72 6f 79 20   p->needDestroy 
fea0: 3d 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  = 1;.  p->aMem =
feb0: 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29   pMem = &((Mem*)
fec0: 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67  p)[1];.  idx = g
fed0: 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
fee0: 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
fef0: 7a 48 64 72 3b 0a 20 20 69 20 3d 20 30 3b 0a 20  zHdr;.  i = 0;. 
ff00: 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
ff10: 72 20 26 26 20 69 3c 70 2d 3e 6e 46 69 65 6c 64  r && i<p->nField
ff20: 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
ff30: 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
ff40: 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
ff50: 28 20 61 4b 65 79 2b 69 64 78 2c 20 73 65 72 69  ( aKey+idx, seri
ff60: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66  al_type);.    if
ff70: 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c  ( d>=nKey && sql
ff80: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
ff90: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
ffa0: 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e)>0 ) break;.  
ffb0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
ffc0: 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
ffd0: 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
ffe0: 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d  Info->db;.    pM
fff0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em->flags = 0;. 
10000 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
10010 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
10020 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10030 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
10040 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
10050 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
10060 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e    i++;.  }.  p->
10070 6e 46 69 65 6c 64 20 3d 20 69 3b 0a 20 20 72 65  nField = i;.  re
10080 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d  turn (void*)p;.}
10090 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
100a0 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20  tine destroys a 
100b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f  UnpackedRecord o
100c0 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
100d0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
100e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e  npackedRecord(Un
100f0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
10100 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
10110 20 69 66 28 20 70 2d 3e 6e 65 65 64 44 65 73 74   if( p->needDest
10120 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  roy ){.      int
10130 20 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70   i;.      Mem *p
10140 4d 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Mem;.      for(i
10150 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d  =0, pMem=p->aMem
10160 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69  ; i<p->nField; i
10170 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  ++, pMem++){.   
10180 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a       if( pMem->z
10190 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
101a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
101b0 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
101c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
101d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
101e0 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 29 7b 0a   p->needFree ){.
101f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10200 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(p);.    }.  }
10210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
10220 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
10230 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
10240 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
10250 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
10260 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
10270 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
10280 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
10290 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
102a0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
102b0 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70  ger if {nKey1, p
102c0 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68  Key1} is less th
102d0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
102e0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
102f0 20 70 50 4b 65 79 32 2e 20 20 54 68 65 20 7b 6e   pPKey2.  The {n
10300 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
10310 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
10320 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
10330 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
10340 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
10350 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
10360 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
10370 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
10380 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
10390 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
103a0 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
103b0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
103c0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
103d0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
103e0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
103f0 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
10400 6c 65 6e 67 74 68 73 20 64 69 66 66 65 72 2c 20  lengths differ, 
10410 4b 65 79 32 20 6d 75 73 74 20 62 65 20 74 68 65  Key2 must be the
10420 20 73 68 6f 72 74 65 72 20 6f 66 20 74 68 65 20   shorter of the 
10430 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 48 69 73 74 6f  two..**.** Histo
10440 72 69 63 61 6c 20 6e 6f 74 65 3a 20 49 6e 20 65  rical note: In e
10450 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
10460 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
10470 62 6f 74 68 20 4b 65 79 31 0a 2a 2a 20 61 6e 64  both Key1.** and
10480 20 4b 65 79 32 20 77 65 72 65 20 62 6c 6f 62 73   Key2 were blobs
10490 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 4f   obtained from O
104a0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 42  P_MakeRecord.  B
104b0 75 74 20 77 65 20 66 6f 75 6e 64 0a 2a 2a 20 74  ut we found.** t
104c0 68 61 74 20 69 6e 20 74 79 70 69 63 61 6c 20 75  hat in typical u
104d0 73 65 20 74 68 65 20 73 61 6d 65 20 4b 65 79 32  se the same Key2
104e0 20 77 6f 75 6c 64 20 62 65 20 73 75 62 6d 69 74   would be submit
104f0 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ted multiple tim
10500 65 73 0a 2a 2a 20 69 6e 20 61 20 72 6f 77 2e 20  es.** in a row. 
10510 20 53 6f 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   So an optimizat
10520 69 6f 6e 20 77 61 73 20 61 64 64 65 64 20 74 6f  ion was added to
10530 20 70 61 72 73 65 20 74 68 65 20 4b 65 79 32 20   parse the Key2 
10540 6b 65 79 0a 2a 2a 20 73 65 70 61 72 61 74 65 6c  key.** separatel
10550 79 20 61 6e 64 20 73 75 62 6d 69 74 20 74 68 65  y and submit the
10560 20 70 61 72 73 65 64 20 76 65 72 73 69 6f 6e 2e   parsed version.
10570 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 77    In this way, w
10580 65 20 61 76 6f 69 64 0a 2a 2a 20 70 61 72 73 69  e avoid.** parsi
10590 6e 67 20 74 68 65 20 73 61 6d 65 20 4b 65 79 32  ng the same Key2
105a0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
105b0 69 6e 20 61 20 72 6f 77 2e 0a 2a 2f 0a 69 6e 74  in a row..*/.int
105c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
105d0 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
105e0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
105f0 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 55 6e  id *pKey1, .  Un
10600 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
10610 4b 65 79 32 0a 29 7b 0a 20 20 75 33 32 20 64 31  Key2.){.  u32 d1
10620 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10630 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
10640 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
10650 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
10660 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
10670 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
10680 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
10690 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
106a0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
106b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
106c0 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
106d0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
106e0 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
106f0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10700 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10710 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
10720 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10730 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
10740 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
10750 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
10760 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
10770 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
10780 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
10790 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
107a0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
107b0 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
107c0 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c   0;.  mem1.zMall
107d0 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78  oc = 0;.  .  idx
107e0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
107f0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
10800 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
10810 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
10820 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
10830 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
10840 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
10850 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
10860 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
10870 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
10880 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
10890 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
108a0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
108b0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
108c0 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
108d0 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
108e0 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
108f0 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
10900 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
10910 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
10920 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
10930 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
10940 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
10950 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
10960 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
10970 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
10980 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
10990 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
109a0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
109b0 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
109c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
109d0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
109e0 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
109f0 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
10a20 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
10a30 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
10a40 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
10a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
10a60 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31 2e  .  }.  if( mem1.
10a70 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
10a80 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
10a90 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 4f 6e  &mem1);..  /* On
10aa0 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
10ab0 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
10ac0 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
10ad0 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
10ae0 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
10af0 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
10b00 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
10b10 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
10b20 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
10b30 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
10b40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
10b50 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
10b60 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
10b70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
10b80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10b90 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69  !pKeyInfo->prefi
10ba0 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20  xIsEqual ){.    
10bb0 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29    if( d1<nKey1 )
10bc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
10bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10be0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
10bf0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
10c00 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e   && i<pKeyInfo->
10c10 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20  nField.         
10c20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66        && pKeyInf
10c30 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
10c40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63   ){.    rc = -rc
10c50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
10c60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
10c70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
10c80 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70  index entry comp
10c90 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  osed using the O
10ca0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
10cb0 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  ode..** The last
10cc0 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72   entry in this r
10cd0 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
10ce0 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63  an integer (spec
10cf0 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69  ifically.** an i
10d00 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20  nteger rowid).  
10d10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
10d20 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
10d30 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74  of bytes in.** t
10d40 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  hat integer..*/.
10d50 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
10d60 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74  dxRowidLen(const
10d70 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
10d80 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
10d90 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
10da0 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
10db0 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
10dc0 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
10dd0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 28  he rowid */..  (
10de0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
10df0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
10e00 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
10e10 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31  32(&aKey[szHdr-1
10e20 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
10e30 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
10e40 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
10e50 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20  (typeRowid);.}. 
10e60 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
10e70 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
10e80 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
10e90 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
10ea0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
10eb0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
10ec0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
10ed0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
10ee0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
10ef0 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
10f00 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
10f10 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
10f20 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
10f30 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
10f40 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
10f50 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  dxRowid(BtCursor
10f60 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
10f70 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
10f80 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
10f90 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
10fa0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10fb0 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
10fc0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
10fd0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
10fe0 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
10ff0 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
11000 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
11010 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
11020 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71   Mem m, v;..  sq
11030 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
11040 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
11050 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
11060 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey<=0 ){.    ret
11070 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11080 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d  PT_BKPT;.  }.  m
11090 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e  .flags = 0;.  m.
110a0 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c  db = 0;.  m.zMal
110b0 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  loc = 0;.  rc = 
110c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
110d0 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
110e0 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d   nCellKey, 1, &m
110f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
11100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11110 7d 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  }.  (void)getVar
11120 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
11130 73 7a 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29  szHdr);.  (void)
11140 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
11150 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20  )&m.z[szHdr-1], 
11160 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65  typeRowid);.  le
11170 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
11180 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
11190 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  n(typeRowid);.  
111a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
111b0 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
111c0 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
111d0 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
111e0 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
111f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
11200 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
11210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
11230 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
11240 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
11250 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
11260 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a  oint to against.
11270 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
11280 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65  g in pKey (of le
11290 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69  ngth nKey).  Wri
112a0 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
112b0 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
112c0 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
112d0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
112e0 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
112f0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
11300 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
11310 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Key.  Return SQL
11320 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
11330 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73  s..**.** pKey is
11340 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
11350 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
11360 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
11370 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
11380 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
11390 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
113a0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
113b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
113c0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
113d0 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74   as well..*/.int
113e0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
113f0 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72  eyCompare(.  Cur
11400 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
11410 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11420 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
11430 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
11440 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
11450 55 6e 70 61 63 6b 65 64 2c 0a 20 20 69 6e 74 20  Unpacked,.  int 
11460 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nKey, const u8 *
11470 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b  pKey,   /* The k
11480 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ey to compare */
11490 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
114b0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
114c0 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
114d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
114e0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
114f0 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
11500 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
11510 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e  ursor;.  int len
11520 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  Rowid;.  Mem m;.
11530 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
11540 20 2a 70 52 65 63 3b 0a 20 20 63 68 61 72 20 7a   *pRec;.  char z
11550 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 73  Space[200];..  s
11560 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
11570 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
11580 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
11590 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72  Key<=0 ){.    *r
115a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
115b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
115c0 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20  }.  m.db = 0;.  
115d0 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d  m.flags = 0;.  m
115e0 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  .zMalloc = 0;.  
115f0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
11600 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
11610 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65  >pCursor, 0, nCe
11620 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
11630 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
11640 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
11650 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
11660 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
11670 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 69  n((u8*)m.z);.  i
11680 66 28 20 21 70 55 6e 70 61 63 6b 65 64 20 29 7b  f( !pUnpacked ){
11690 0a 20 20 20 20 70 52 65 63 20 3d 20 73 71 6c 69  .    pRec = sqli
116a0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
116b0 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  ack(pC->pKeyInfo
116c0 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20  , nKey, pKey,.  
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
116f0 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 7a 53 70  pace, sizeof(zSp
11700 61 63 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ace));.  }else{.
11710 20 20 20 20 70 52 65 63 20 3d 20 70 55 6e 70 61      pRec = pUnpa
11720 63 6b 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  cked;.  }.  if( 
11730 70 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pRec==0 ){.    r
11740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11750 45 4d 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  EM;.  }.  *res =
11760 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
11770 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2d 6c 65  rdCompare(m.n-le
11780 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 70 52 65  nRowid, m.z, pRe
11790 63 29 3b 0a 20 20 69 66 28 20 21 70 55 6e 70 61  c);.  if( !pUnpa
117a0 63 6b 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  cked ){.    sqli
117b0 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
117c0 61 63 6b 65 64 52 65 63 6f 72 64 28 70 52 65 63  ackedRecord(pRec
117d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
117e0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
117f0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
11800 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11810 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
11820 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
11830 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
11840 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
11850 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
11860 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
11870 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
11880 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
11890 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
118a0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
118b0 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
118c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
118d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
118e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
118f0 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
11900 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
11910 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
11920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
11930 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
11940 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
11950 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
11960 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
11970 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
11980 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11990 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
119a0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
119b0 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
119c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
119d0 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
119e0 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
119f0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
11a00 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
11a10 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
11a20 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
11a30 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
11a40 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
11a50 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
11a60 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
11a70 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
11a80 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
11a90 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
11aa0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
11ab0 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
11ac0 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
11ad0 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
11ae0 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
11af0 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
11b00 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
11b10 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
11b20 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
11b30 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
11b40 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
11b50 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
11b60 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
11b70 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
11b80 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
11b90 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
11ba0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
11bb0 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
11bc0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
11bd0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
11be0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
11bf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
11c00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
11c10 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
11c20 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
11c30 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
11c40 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a     eturn v->db;.}.