/ Hex Artifact Content
Login

Artifact 81a433ce73b79df605cc9709af430362e771ecdc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 30 34 20 32  eaux.c,v 1.404 2
02c0: 30 30 38 2f 30 38 2f 30 31 20 32 30 3a 31 30 3a  008/08/01 20:10:
02d0: 30 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  08 drh Exp $.*/.
02e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0300: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0310: 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a  de "vdbeInt.h"..
0320: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65 62  ../*.** When deb
0330: 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65 20  ugging the code 
0340: 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20 73  generator in a s
0350: 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65 72  ymbolic debugger
0360: 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65 74  , one can.** set
0370: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
0380: 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20 31 20  AddopTrace to 1 
0390: 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  and all opcodes 
03a0: 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 64 0a  will be printed.
03b0: 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65 20 61  ** as they are a
03c0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 73 74  dded to the inst
03d0: 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d 2e 0a  ruction stream..
03e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
03f0: 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
0400: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
0410: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f   = 0;.#endif.../
0420: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
0430: 77 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  w virtual databa
0440: 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64  se engine..*/.Vd
0450: 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 43  be *sqlite3VdbeC
0460: 72 65 61 74 65 28 73 71 6c 69 74 65 33 20 2a 64  reate(sqlite3 *d
0470: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
0480: 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
0490: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
04a0: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
04b0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
04c0: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04d0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04e0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04f0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
0500: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
0510: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
0520: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0530: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0540: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0550: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0560: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
0570: 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20  emember the SQL 
0580: 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65  string for a pre
0590: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
05a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
05b0: 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 65 20  VdbeSetSql(Vdbe 
05c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
05d0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28  z, int n){.  if(
05e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
05f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0600: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0610: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0620: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
0640: 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63  rn the SQL assoc
0650: 69 61 74 65 64 20 77 69 74 68 20 61 20 70 72 65  iated with a pre
0660: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
0670: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
0680: 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74  qlite3_sql(sqlit
0690: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
06a0: 0a 20 20 72 65 74 75 72 6e 20 28 28 56 64 62 65  .  return ((Vdbe
06b0: 20 2a 29 70 53 74 6d 74 29 2d 3e 7a 53 71 6c 3b   *)pStmt)->zSql;
06c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61  .}../*.** Swap a
06d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65  ll content betwe
06e0: 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74 72 75  en two VDBE stru
06f0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0700: 73 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28  sqlite3VdbeSwap(
0710: 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a  Vdbe *pA, Vdbe *
0720: 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c  pB){.  Vdbe tmp,
0730: 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a   *pTmp;.  char *
0740: 7a 54 6d 70 3b 0a 20 20 69 6e 74 20 6e 54 6d 70  zTmp;.  int nTmp
0750: 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20  ;.  tmp = *pA;. 
0760: 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70   *pA = *pB;.  *p
0770: 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20  B = tmp;.  pTmp 
0780: 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pA->pNext;.  p
0790: 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70  A->pNext = pB->p
07a0: 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78  Next;.  pB->pNex
07b0: 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70  t = pTmp;.  pTmp
07c0: 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20   = pA->pPrev;.  
07d0: 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e  pA->pPrev = pB->
07e0: 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72  pPrev;.  pB->pPr
07f0: 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d  ev = pTmp;.  zTm
0800: 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20  p = pA->zSql;.  
0810: 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a  pA->zSql = pB->z
0820: 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20  Sql;.  pB->zSql 
0830: 3d 20 7a 54 6d 70 3b 0a 20 20 6e 54 6d 70 20 3d  = zTmp;.  nTmp =
0840: 20 70 41 2d 3e 6e 53 71 6c 3b 0a 20 20 70 41 2d   pA->nSql;.  pA-
0850: 3e 6e 53 71 6c 20 3d 20 70 42 2d 3e 6e 53 71 6c  >nSql = pB->nSql
0860: 3b 0a 20 20 70 42 2d 3e 6e 53 71 6c 20 3d 20 6e  ;.  pB->nSql = n
0870: 54 6d 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Tmp;.}..#ifdef S
0880: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0890: 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67 20 6f  * Turn tracing o
08a0: 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64  n or off.*/.void
08b0: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
08c0: 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c 45 20  e(Vdbe *p, FILE 
08d0: 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72  *trace){.  p->tr
08e0: 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 23  ace = trace;.}.#
08f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  endif../*.** Res
0900: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70  ize the Vdbe.aOp
0910: 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 69   array so that i
0920: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
0930: 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ast N.** element
0940: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  s..**.** If an o
0950: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
0960: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
0970: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0980: 61 79 2c 0a 2a 2a 20 56 64 62 65 2e 61 4f 70 20  ay,.** Vdbe.aOp 
0990: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
09a0: 63 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  c remain unchang
09b0: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
09c0: 68 61 74 0a 2a 2a 20 61 6e 79 20 6f 70 63 6f 64  hat.** any opcod
09d0: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
09e0: 61 74 65 64 20 63 61 6e 20 62 65 20 63 6f 72 72  ated can be corr
09f0: 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65  ectly deallocate
0a00: 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
0a10: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
0a20: 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vdbe)..*/.static
0a30: 20 76 6f 69 64 20 72 65 73 69 7a 65 4f 70 41 72   void resizeOpAr
0a40: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
0a50: 20 4e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70   N){.  VdbeOp *p
0a60: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
0a70: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0a80: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 4e 2a  ->db, p->aOp, N*
0a90: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69  sizeof(Op));.  i
0aa0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
0ab0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 4e 3b 0a  ->nOpAlloc = N;.
0ac0: 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65      p->aOp = pNe
0ad0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
0ae0: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75  Add a new instru
0af0: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73  ction to the lis
0b00: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
0b10: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65  s current in the
0b20: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72  .** VDBE.  Retur
0b30: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
0b40: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
0b50: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  tion..**.** Para
0b60: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  meters:.**.**   
0b70: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20   p              
0b80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
0b90: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70  VDBE.**.**    op
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
0bb0: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69  e opcode for thi
0bc0: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
0bd0: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70  .**    p1, p2, p
0be0: 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a  3      Operands.
0bf0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0c00: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0c10: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0c20: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0c30: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0c40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0c50: 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  4() function to 
0c60: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0c70: 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70   of the P4.** op
0c80: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0ca0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0cb0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c   int p1, int p2,
0cc0: 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20   int p3){.  int 
0cd0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  i;.  VdbeOp *pOp
0ce0: 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b  ;..  i = p->nOp;
0cf0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
0d00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
0d10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
0d20: 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a  >nOpAlloc<=i ){.
0d30: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
0d40: 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  y(p, p->nOpAlloc
0d50: 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   ? p->nOpAlloc*2
0d60: 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f   : 1024/sizeof(O
0d70: 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p));.    if( p->
0d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0d90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0da0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0db0: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
0dc0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0dd0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70  pOp->opcode = op
0de0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0df0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0e00: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0e10: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0e20: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0e30: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0e40: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0e50: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0e60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0e70: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0e80: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0ea0: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0eb0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0ec0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0ed0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0ee0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0ef0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0f00: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
0f10: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
0f20: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0f30: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
0f40: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
0f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0f60: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
0f70: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
0f80: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
0f90: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
0fa0: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
0fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
0fc0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
0fd0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
0fe0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
0ff0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1000: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1020: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1030: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1040: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1050: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1060: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1070: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1080: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1090: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10b0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
10c0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
10d0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
10e0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
10f0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1110: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1120: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1140: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1150: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1160: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1170: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1180: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1190: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
11a0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
11c0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
11d0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
11e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11f0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1200: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1210: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1220: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1230: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1250: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
1260: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
1270: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
1280: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
1290: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
12a0: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
12b0: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
12c0: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
12d0: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
12e0: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
12f0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
1300: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
1310: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
1320: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
1330: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
1340: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
1350: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
1360: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
1370: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
1380: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
1390: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
13a0: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
13b0: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
13c0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
13d0: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
13e0: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
13f0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
1400: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
1410: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
1420: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
1430: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
1440: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
1450: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
1460: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1470: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
1480: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
1490: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
14a0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
14b0: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  c() fails..*/.in
14c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
14d0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b  eLabel(Vdbe *p){
14e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
14f0: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1500: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1510: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1520: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
1530: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20  nLabelAlloc ){. 
1540: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
1550: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
1560: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 70  oc*2 + 10;.    p
1570: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1580: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1590: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
15a0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 61 62 65          p->nLabe
15d0: 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d  lAlloc*sizeof(p-
15e0: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
15f0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1600: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1610: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1620: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1630: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1640: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1650: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1660: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1670: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1680: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1690: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
16a0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
16b0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
16c0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
16d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
16e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1700: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1710: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1720: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1730: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1740: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1750: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1760: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1770: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1780: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1790: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
17a0: 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  /*.** Loop throu
17b0: 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c  gh the program l
17c0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61  ooking for P2 va
17d0: 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65  lues that are ne
17e0: 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d  gative.** on jum
17f0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  p instructions. 
1800: 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65   Each such value
1810: 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65   is a label.  Re
1820: 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62  solve the.** lab
1830: 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  el by setting th
1840: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74  e P2 value to it
1850: 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65  s correct non-ze
1860: 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
1870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1880: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65  called once afte
1890: 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61  r all opcodes ha
18a0: 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  ve been inserted
18b0: 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65  ..**.** Variable
18c0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69   *pMaxFuncArgs i
18d0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78  s set to the max
18e0: 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e  imum value of an
18f0: 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a  y P2 argument .*
1900: 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74  * to an OP_Funct
1910: 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20  ion, OP_AggStep 
1920: 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70  or OP_VFilter op
1930: 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73  code. This is us
1940: 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65  ed by .** sqlite
1950: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29  3VdbeMakeReady()
1960: 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62   to size the Vdb
1970: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e  e.apArg[] array.
1980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1990: 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68  ine also does th
19a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69  e following opti
19b0: 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63  mization:  It sc
19c0: 61 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73 74 72  ans for.** instr
19d0: 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  uctions that mig
19e0: 68 74 20 63 61 75 73 65 20 61 20 73 74 61 74 65  ht cause a state
19f0: 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  ment rollback.  
1a00: 53 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  Such instruction
1a10: 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  s.** are:.**.** 
1a20: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74    *  OP_Halt wit
1a30: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
1a40: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
1a50: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
1a60: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
1a70: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
1a80: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
1a90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 63  .**.** If no suc
1aa0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
1ab0: 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65   found, then eve
1ac0: 72 79 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73  ry Statement ins
1ad0: 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  truction .** is 
1ae0: 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f  changed to a Noo
1af0: 70 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  p.  In this way,
1b00: 20 77 65 20 61 76 6f 69 64 20 63 72 65 61 74 69   we avoid creati
1b10: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
1b20: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
1b30: 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e  e unnecessarily.
1b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b50: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
1b70: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
1b80: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nt i;.  int nMax
1b90: 41 72 67 73 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  Args = 0;.  Op *
1ba0: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
1bb0: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
1bc0: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
1bd0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
1be0: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
1bf0: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
1c00: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
1c10: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
1c20: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
1c30: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
1c40: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
1c50: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1c60: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
1c70: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
1c80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1c90: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
1ca0: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
1cb0: 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  5;.#ifndef SQLIT
1cc0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1cd0: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
1ce0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
1cf0: 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66  date ){.      if
1d00: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
1d10: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
1d20: 70 4f 70 2d 3e 70 32 3b 0a 23 65 6e 64 69 66 0a  pOp->p2;.#endif.
1d30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
1d40: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b  code==OP_Halt ){
1d50: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1d60: 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  p1==SQLITE_CONST
1d70: 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32  RAINT && pOp->p2
1d80: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
1d90: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
1da0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
1db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1dc0: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
1dd0: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
1de0: 20 20 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e       hasStatemen
1df0: 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20  tBegin = 1;.    
1e00: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1e10: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a  ==OP_Destroy ){.
1e20: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
1e30: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
1e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e50: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e60: 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
1e70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
1e80: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
1e90: 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  _VRename ){.    
1ea0: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1eb0: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1ec0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1ed0: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
1ee0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1ef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
1f00: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
1f10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
1f20: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
1f30: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
1f40: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
1f50: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
1f60: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
1f70: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
1f80: 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
1f90: 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73  te3VdbeOpcodeHas
1fa0: 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65 2c  Property(opcode,
1fb0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26 26 20   OPFLG_JUMP) && 
1fc0: 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20  pOp->p2<0 ){.   
1fd0: 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f     assert( -1-pO
1fe0: 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20  p->p2<p->nLabel 
1ff0: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  );.      pOp->p2
2000: 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70   = aLabel[-1-pOp
2010: 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->p2];.    }.  }
2020: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2030: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
2040: 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20  l);.  p->aLabel 
2050: 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e  = 0;..  *pMaxFun
2060: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
2070: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65  ;..  /* If we ne
2080: 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73  ver rollback a s
2090: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
20a0: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65  tion, then state
20b0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
20c0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e  ctions are not n
20d0: 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67  eeded.  So chang
20e0: 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65  e every OP_State
20f0: 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ment.  ** opcode
2100: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2110: 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20  .  This avoid a 
2120: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2130: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2140: 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20  .  ** which can 
2150: 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20  be expensive on 
2160: 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a  some platforms..
2170: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74    */.  if( hasSt
2180: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20  atementBegin && 
2190: 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f  !doesStatementRo
21a0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
21b0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
21c0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
21d0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
21e0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
21f0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
2200: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   ){.        pOp-
2210: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
2220: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2230: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2240: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
2250: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2260: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
2270: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
2280: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2290: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
22a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
22b0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
22c0: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
22d0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
22e0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
22f0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
2300: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2310: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2320: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2330: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2340: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2360: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
2370: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
2380: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
2390: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
23a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
23b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
23c0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
23d0: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e  nOp + nOp > p->n
23e0: 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 72  OpAlloc ){.    r
23f0: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20  esizeOpArray(p, 
2400: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d  p->nOpAlloc ? p-
2410: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30  >nOpAlloc*2 : 10
2420: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  24/sizeof(Op));.
2430: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2440: 4f 70 2b 6e 4f 70 3c 3d 70 2d 3e 6e 4f 70 41 6c  Op+nOp<=p->nOpAl
2450: 6c 6f 63 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  loc || p->db->ma
2460: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
2470: 7d 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  }.  if( p->db->m
2480: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2490: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
24a0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
24b0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b  ;.  if( nOp>0 ){
24c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24d0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
24e0: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
24f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
2500: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
2510: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
2520: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
2530: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
2540: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
2550: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
2560: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
2570: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
2580: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
2590: 28 20 70 32 3c 30 20 26 26 20 73 71 6c 69 74 65  ( p2<0 && sqlite
25a0: 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72  3VdbeOpcodeHasPr
25b0: 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63  operty(pOut->opc
25c0: 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  ode, OPFLG_JUMP)
25d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74   ){.        pOut
25e0: 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44  ->p2 = addr + AD
25f0: 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65  DR(p2);.      }e
2600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75  lse{.        pOu
2610: 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20  t->p2 = p2;.    
2620: 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e    }.      pOut->
2630: 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20  p3 = pIn->p3;.  
2640: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
2650: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
2660: 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20       pOut->p4.p 
2670: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  = 0;.      pOut-
2680: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
2690: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
26a0: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
26b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
26c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
26d0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
26e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
26f0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
2700: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
2710: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2720: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
2730: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
2740: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
2750: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2760: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
2770: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
2780: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
2790: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
27a0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
27b0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
27c0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
27d0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
27e0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
27f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
2800: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
2810: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
2820: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
2830: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  e program..*/.vo
2840: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2850: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
2860: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
2870: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
2880: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
2890: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
28a0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
28b0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
28c0: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
28d0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
28e0: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
28f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2900: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2910: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
2920: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2930: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
2940: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
2950: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
2960: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
2970: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2980: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
2990: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
29a0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
29b0: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
29c0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
29d0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
29e0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
29f0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
2a00: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
2a10: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
2a20: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
2a30: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2a40: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
2a50: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2a60: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2a70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a80: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
2a90: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2aa0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2ab0: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
2ac0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2ad0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2ae0: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2af0: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2b00: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2b10: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
2b20: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2b30: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2b40: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
2b50: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
2b60: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
2b70: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
2b80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2b90: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
2ba0: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
2bb0: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2bc0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2bd0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2be0: 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  p && p->aOp ){. 
2bf0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
2c00: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
2c10: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
2c20: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2c30: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
2c40: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
2c50: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
2c60: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2c70: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
2c80: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2c90: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
2ca0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
2cb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2cc0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
2cd0: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
2ce0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
2cf0: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
2d00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
2d10: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
2d20: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
2d30: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
2d40: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
2d50: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
2d60: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
2d70: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
2d80: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
2d90: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
2da0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
2db0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
2dc0: 70 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e 66  pDef && (pDef->f
2dd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2de0: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
2df0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e00: 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d  e(db, pDef);.  }
2e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2e20: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
2e30: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
2e40: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
2e50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2e60: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
2e70: 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a  4){.  if( p4 ){.
2e80: 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79      switch( p4ty
2e90: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
2ea0: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20   P4_REAL:.      
2eb0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
2ec0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52       case P4_MPR
2ed0: 49 4e 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65  INTF:.      case
2ee0: 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20   P4_DYNAMIC:.   
2ef0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
2f00: 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  FO:.      case P
2f10: 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20  4_INTARRAY:.    
2f20: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
2f30: 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20  O_HANDOFF: {.   
2f40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2f50: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20  ee(db, p4);.    
2f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2f70: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
2f80: 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20  _VDBEFUNC: {.   
2f90: 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70       VdbeFunc *p
2fa0: 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65  VdbeFunc = (Vdbe
2fb0: 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20  Func *)p4;.     
2fc0: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
2fd0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64  Function(db, pVd
2fe0: 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a  beFunc->pFunc);.
2ff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3000: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
3010: 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a  (pVdbeFunc, 0);.
3020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3030: 62 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46  bFree(db, pVdbeF
3040: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  unc);.        br
3050: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3060: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
3070: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
3080: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3090: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
30a0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
30b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
30c0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
30d0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
30e0: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
30f0: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b  ite3_value*)p4);
3100: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3110: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3120: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  }.}.../*.** Chan
3130: 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61  ge N opcodes sta
3140: 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f  rting at addr to
3150: 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64   No-ops..*/.void
3160: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3170: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
3180: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
3190: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  N){.  if( p && p
31a0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
31b0: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
31c0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
31d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
31e0: 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  b;.    while( N-
31f0: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
3200: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
3210: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
3220: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
3230: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
3240: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
3250: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
3260: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
3270: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3280: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3290: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
32a0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
32b0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
32c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
32d0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
32e0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
32f0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
3300: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
3310: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
3320: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
3330: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
3340: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
3350: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
3360: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
3370: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
3380: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
3390: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
33a0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
33b0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
33c0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
33d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
33e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
33f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
3400: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
3410: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
3420: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
3430: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
3440: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
3450: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
3460: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
3470: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
3480: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
3490: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
34a0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
34b0: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
34c0: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
34d0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
34e0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
34f0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
3500: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
3510: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
3520: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
3530: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
3540: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
3550: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
3560: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
3570: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3580: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
3590: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
35a0: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
35b0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
35c0: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
35d0: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
35e0: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
35f0: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
3600: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3610: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3620: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3630: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3640: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
3650: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
3660: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
3670: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
3680: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
3690: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
36a0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
36b0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
36c0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
36d0: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
36e0: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
36f0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
3700: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3710: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
3720: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3730: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3740: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
3760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3770: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
3780: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
3790: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
37a0: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
37b0: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
37c0: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
37d0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
37e0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
37f0: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
3800: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
3810: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20 21  d ){.    if (n !
3820: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a  = P4_KEYINFO) {.
3830: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
3840: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
3850: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
3860: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3870: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
3880: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
3890: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
38a0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
38b0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20  .    if( addr<0 
38c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
38d0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
38e0: 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62  dr];.  freeP4(db
38f0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
3900: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
3910: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
3920: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
3930: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
3940: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
3950: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
3960: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
3970: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
3980: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
3990: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
39a0: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
39b0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
39c0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
39d0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
39e0: 20 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   n;.  }else if( 
39f0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
3a00: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
3a10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3a20: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
3a30: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
3a40: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
3a50: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
3a60: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e     int nField, n
3a70: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c  Byte;..    nFiel
3a80: 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a  d = ((KeyInfo*)z
3a90: 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20  P4)->nField;.   
3aa0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
3ab0: 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46  *pKeyInfo) + (nF
3ac0: 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70  ield-1)*sizeof(p
3ad0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
3ae0: 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ]) + nField;.   
3af0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
3b00: 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  te3Malloc( nByte
3b10: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
3b20: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
3b30: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
3b40: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
3b50: 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  8 *aSortOrder;. 
3b60: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3b70: 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65  Info, zP4, nByte
3b80: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
3b90: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
3ba0: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3bb0: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
3bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
3bd0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3be0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3bf0: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
3c00: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
3c10: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3c20: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3c30: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
3c40: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
3c50: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3c60: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
3c70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3c80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3c90: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
3ca0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3cb0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3cc0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
3cd0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3ce0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3cf0: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
3d00: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3d10: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
3d20: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3d30: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3d40: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
3d50: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e   pOp->p4type = n
3d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d70: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74  f( n==0 ) n = st
3d80: 72 6c 65 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70  rlen(zP4);.    p
3d90: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
3da0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
3db0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
3dc0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3dd0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3de0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3df0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3e00: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
3e10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3e20: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
3e30: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
3e40: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
3e50: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
3e60: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
3e70: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
3e80: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
3e90: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
3ea0: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
3eb0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
3ec0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
3ed0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
3ee0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ef0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
3f00: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3f10: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
3f20: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3f30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
3f40: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
3f50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
3f60: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
3f70: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
3f80: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
3f90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3fa0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
3fb0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
3fc0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3fd0: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
3fe0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
3ff0: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
4000: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
4010: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
4020: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
4030: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
4040: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
4050: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
4060: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
4070: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
4080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
4090: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
40a0: 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65  ist ap;.  sqlite
40b0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
40c0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72  P_Noop);.  asser
40d0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
40e0: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
40f0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
4100: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
4110: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
4120: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
4130: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
4140: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
4150: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
4160: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4170: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
4180: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
4190: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
41a0: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
41b0: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
41c0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
41d0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
41e0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
41f0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
4200: 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
4210: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f   Return the opco
4220: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61  de for a given a
4230: 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f  ddress..*/.VdbeO
4240: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
4250: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
4260: 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74   addr){.  assert
4270: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4280: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
4290: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
42a0: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
42b0: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
42c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 65  ocFailed );.  re
42d0: 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26  turn ((addr>=0 &
42e0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28  & addr<p->nOp)?(
42f0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30  &p->aOp[addr]):0
4300: 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  );.}..#if !defin
4310: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
4320: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
4330: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
4340: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
4350: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
4360: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
4370: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
4380: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
4390: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
43a0: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
43b0: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
43c0: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
43d0: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
43e0: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
43f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
4400: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
4410: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
4420: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
4430: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
4440: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
4450: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
4460: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
4470: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
4480: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
4490: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
44a0: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
44b0: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
44c0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
44d0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
44e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
44f0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4500: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
4510: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
4520: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
4530: 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a   strlen(zTemp);.
4540: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4550: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
4560: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4570: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
4580: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
4590: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
45a0: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
45b0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
45c0: 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  len(pColl->zName
45d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
45e0: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
4600: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
4610: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
4620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4640: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
4650: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
4660: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4670: 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66  Order && pKeyInf
4680: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
4690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
46a0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
46b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
46c0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
46d0: 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d  zTemp[i], pColl-
46e0: 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20  >zName,n+1);.   
46f0: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
4700: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
4710: 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+4<nTemp-6 ){.
4720: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
4730: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c  (&zTemp[i],",nil
4740: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
4750: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
4760: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4770: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
4780: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
4790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
47a0: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
47b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
47c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  }.    case P4_CO
47d0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
47e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
47f0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
4800: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4810: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4820: 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32  mp, "collseq(%.2
4830: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
4840: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
4850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4860: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
4870: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
4880: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
4890: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
48a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
48b0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
48c0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
48d0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
48e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
48f0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
4900: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
4910: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4920: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
4930: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
4940: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4950: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4960: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
4970: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4980: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4990: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
49a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
49c0: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
49d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
49e0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
49f0: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
4a00: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
4a10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4a20: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
4a30: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
4a40: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
4a50: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
4a60: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
4a70: 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ll)==0 );.      
4a80: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4a90: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
4aa0: 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d       zP4 = pMem-
4ab0: 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  >z;.      }else 
4ac0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4ad0: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
4ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4af0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4b00: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  mp, "%lld", pMem
4b10: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
4b20: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
4b30: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
4b40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4b50: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4b60: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
4b70: 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  , pMem->r);.    
4b80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4b90: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
4ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4bb0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
4bc0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
4bd0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
4be0: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
4bf0: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  pVtab;.      sql
4c00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4c10: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61  emp, zTemp, "vta
4c20: 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c  b:%p:%p", pVtab,
4c30: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29   pVtab->pModule)
4c40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4c60: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
4c70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4c80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4c90: 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72  , zTemp, "intarr
4ca0: 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ay");.      brea
4cb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
4cc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
4cd0: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
4ce0: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
4cf0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
4d00: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
4d10: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
4d20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4d30: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
4d40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
4d50: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4d60: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
4d70: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
4d80: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
4d90: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
4da0: 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71  d..**.*/.void sq
4db0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
4dc0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
4dd0: 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  i){.  int mask;.
4de0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
4df0: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29  & i<p->db->nDb )
4e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73 69  ;.  assert( i<si
4e10: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
4e20: 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d  k)*8 );.  mask =
4e30: 20 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d   1<<i;.  if( (p-
4e40: 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73  >btreeMask & mas
4e50: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  k)==0 ){.    p->
4e60: 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  btreeMask |= mas
4e70: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  k;.    sqlite3Bt
4e80: 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73  reeMutexArrayIns
4e90: 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20  ert(&p->aMutex, 
4ea0: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
4eb0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20  t);.  }.}...#if 
4ec0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
4ed0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
4ee0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
4ef0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
4f00: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
4f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4f20: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
4f30: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
4f40: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4f50: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
4f60: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
4f70: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
4f80: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
4f90: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4fa0: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
4fb0: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
4fc0: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
4fd0: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
4fe0: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
4ff0: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
5000: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
5010: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
5020: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
5030: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
5040: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
5050: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
5060: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
5070: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
5080: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
5090: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
50a0: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
50b0: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
50c0: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
50d0: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
50e0: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
50f0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
5100: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
5110: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
5120: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
5130: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
5140: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
5150: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
5160: 26 26 20 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  && N ){.    sqli
5170: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
5180: 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f  .    int malloc_
5190: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
51a0: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 77  locFailed;.    w
51b0: 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20  hile( N-->0 ){. 
51c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32       assert( N<2
51d0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
51e0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 73 71  ].db );.      sq
51f0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
5200: 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 70 2d  ase(p);.      p-
5210: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
5220: 6c 3b 0a 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20  l;.      p++;.  
5230: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c    }.    db->mall
5240: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
5250: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
5260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5270: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
5280: 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
5290: 74 65 33 56 64 62 65 52 65 6c 65 61 73 65 42 75  te3VdbeReleaseBu
52a0: 66 66 65 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  ffers(Vdbe *p){.
52b0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
52c0: 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 61 73 73  nFree = 0;.  ass
52d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
52e0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
52f0: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
5300: 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d  i=1; ii<=p->nMem
5310: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  ; ii++){.    Mem
5320: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
5330: 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  m[ii];.    if( p
5340: 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d 2d 3e  Mem->z && pMem->
5350: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b  flags&MEM_Dyn ){
5360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
5370: 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a 20 20  pMem->xDel );.  
5380: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 71 6c      nFree += sql
5390: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
53a0: 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d  (pMem->db, pMem-
53b0: 3e 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >z);.      sqlit
53c0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
53d0: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
53e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 46 72 65 65  }.  return nFree
53f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
5400: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5410: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
5420: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
5430: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
5440: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
5450: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
5460: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
5470: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
5480: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
5490: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
54a0: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
54b0: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
54c0: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
54d0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
54e0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
54f0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
5500: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
5510: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
5520: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
5530: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
5540: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
5550: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
5560: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
5570: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
5580: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
5590: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
55a0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
55b0: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
55c0: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
55d0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
55e0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
55f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5600: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
5610: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
5620: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
5630: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
5640: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
5650: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
5660: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
5670: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52  em *pMem = p->pR
5680: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
5690: 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72  Mem[1];..  asser
56a0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
56b0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
56c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
56d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
56e0: 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74  MISUSE;.  assert
56f0: 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c  ( db->magic==SQL
5700: 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29  ITE_MAGIC_BUSY )
5710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
5720: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
5730: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
5740: 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  SY );..  /* Even
5750: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
5760: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
5770: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
5780: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
5790: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
57a0: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
57b0: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
57c0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
57d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
57e0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
57f0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
5800: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
5810: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
5820: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 70  MemArray(pMem, p
5830: 2d 3e 6e 4d 65 6d 29 3b 0a 0a 20 20 64 6f 7b 0a  ->nMem);..  do{.
5840: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
5850: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e  .  }while( i<p->
5860: 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  nOp && p->explai
5870: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
5880: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
5890: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
58a0: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
58b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
58c0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
58d0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
58e0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
58f0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
5900: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
5910: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
5920: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
5930: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
5940: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
5950: 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c  g, db, "%s", sql
5960: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
5970: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
5980: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70   char *z;.    Op
5990: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
59a0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  i];.    if( p->e
59b0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
59c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
59d0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
59e0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
59f0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
5a00: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
5a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
5a40: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
5a50: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
5a60: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5a70: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
5a80: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
5a90: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
5aa0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
5ab0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
5ac0: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
5ad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
5ae0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
5af0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e  pMem->n = strlen
5b00: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
5b10: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5b20: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
5b30: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
5b40: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
5b50: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  pMem++;.    }.. 
5b60: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5b70: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
5b80: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
5b90: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5bb0: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  1 */.    pMem->t
5bc0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5bd0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
5be0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
5bf0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
5c00: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
5c10: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
5c40: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5c50: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
5c60: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
5c70: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
5c80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5c90: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
5ca0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
5cb0: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20   /* P3 */.      
5ce0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5cf0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
5d00: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d     pMem++;.    }
5d10: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
5d20: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
5d30: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
5d40: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
5d50: 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61  .      p->db->ma
5d60: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
5d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5d80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
5d90: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
5da0: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
5db0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
5dc0: 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70   z = displayP4(p
5dd0: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
5de0: 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65  ;.    if( z!=pMe
5df0: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  m->z ){.      sq
5e00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
5e10: 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20  tr(pMem, z, -1, 
5e20: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
5e30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e40: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
5e50: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
5e60: 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  em->n = strlen(p
5e70: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
5e80: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
5e90: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
5ea0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5eb0: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
5ec0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
5ed0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
5ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
5ef0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
5f00: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
5f10: 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c        p->db->mal
5f20: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
5f30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
5f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5f50: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
5f60: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
5f70: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
5f80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5f90: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
5fa0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
5fb0: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
5fc0: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
5fd0: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
5fe0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5ff0: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
6000: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
6010: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
6020: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
6030: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
6040: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
6050: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
6060: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
6070: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
6080: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f      pMem->z = pO
6090: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  p->zComment;.   
60a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
60b0: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
60c0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
60d0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
60e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
60f0: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
6100: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6110: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
6140: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
6150: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
6160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6170: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
6180: 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65  mn = 8 - 5*(p->e
6190: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
61a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
61b0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
61c0: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
61d0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
61e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
61f0: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
6200: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6210: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
6220: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
6230: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
6240: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
6250: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6260: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
6270: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
6280: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
6290: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
62a0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
62b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
62c0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
62d0: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
62e0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
62f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6300: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
6310: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
6320: 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b  e(*(u8*)z) ) z++
6330: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51  ;.    printf("SQ
6340: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
6350: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
6360: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6370: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
6380: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6390: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a  ENABLE_IOTRACE).
63a0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49  /*.** Print an I
63b0: 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73  OTRACE message s
63c0: 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65  howing SQL conte
63d0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
63e0: 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71  te3VdbeIOTraceSq
63f0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
6400: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
6410: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
6420: 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72   if( sqlite3IoTr
6430: 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ace==0 ) return;
6440: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
6450: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
6460: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
6470: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
6480: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
6490: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
64a0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
64b0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
64c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
64d0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
64e0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
64f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70     for(i=0; issp
6500: 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ace((unsigned ch
6510: 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ar)z[i]); i++){}
6520: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
6530: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
6540: 69 66 28 20 69 73 73 70 61 63 65 28 28 75 6e 73  if( isspace((uns
6550: 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29  igned char)z[i])
6560: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6570: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
6580: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
6590: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
65a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
65b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
65c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
65d0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
65e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
65f0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
6600: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
6610: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
6620: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
6630: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
6640: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  */.../*.** Prepa
6650: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
6660: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
6670: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  on.  This involv
6680: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
6690: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
66a0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
66b0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
66c0: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
66d0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
66e0: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
66f0: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
6700: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
6710: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
6720: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
6730: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
6740: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
6750: 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45  y to move a VDBE
6760: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
6770: 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45  _INIT to.** VDBE
6780: 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76  _MAGIC_RUN..*/.v
6790: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
67a0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
67b0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
67c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
67d0: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
67e0: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
67f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6800: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
6810: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
6820: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
6830: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
6840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6850: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
6860: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
6870: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
68a0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
68b0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ate */.  int isE
68c0: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
68d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
68e0: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
68f0: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
6900: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
6910: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
6920: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  = p->db;..  asse
6930: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
6940: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6950: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6960: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
6970: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
6980: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
6990: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
69a0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
69b0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
69c0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
69d0: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
69e0: 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20  n later. This.  
69f0: 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68   * is because th
6a00: 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65  e call to resize
6a10: 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20  OpArray() below 
6a20: 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20  may shrink the. 
6a30: 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72    * p->aOp[] arr
6a40: 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72  ay to save memor
6a50: 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e  y if called when
6a60: 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   in VDBE_MAGIC_R
6a70: 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a  UN .   * state..
6a80: 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63     */.  p->magic
6a90: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
6aa0: 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  N;..  /* For eac
6ab0: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
6ac0: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
6ad0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
6ae0: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
6af0: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
6b00: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
6b10: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
6b20: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
6b30: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
6b40: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
6b50: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
6b60: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
6b70: 2a 2a 20 43 75 72 73 6f 72 2f 42 74 43 75 72 73  ** Cursor/BtCurs
6b80: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
6b90: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
6ba0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
6bb0: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
6bc0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
6bd0: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
6be0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
6bf0: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
6c00: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
6c10: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6c20: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
6c30: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
6c40: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
6c50: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
6c60: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
6c70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
6c80: 63 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72  cation space for
6c90: 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f   registers..  */
6ca0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d  .  if( p->aMem==
6cb0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
6cc0: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
6cd0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
6ce0: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
6cf0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
6d00: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
6d10: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
6d20: 20 20 20 20 2f 2a 72 65 73 69 7a 65 4f 70 41 72      /*resizeOpAr
6d30: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 2a  ray(p, p->nOp);*
6d40: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 56  /.    assert( nV
6d50: 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ar>=0 );.    if(
6d60: 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d   isExplain && nM
6d70: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 70  em<10 ){.      p
6d80: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20  ->nMem = nMem = 
6d90: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  10;.    }.    p-
6da0: 3e 61 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  >aMem = sqlite3D
6db0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a  bMallocZero(db,.
6dc0: 20 20 20 20 20 20 20 20 6e 4d 65 6d 2a 73 69 7a          nMem*siz
6dd0: 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20  eof(Mem)        
6de0: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a         /* aMem *
6df0: 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73  /.      + nVar*s
6e00: 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20  izeof(Mem)      
6e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72           /* aVar
6e20: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67   */.      + nArg
6e30: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20  *sizeof(Mem*)   
6e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
6e50: 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Arg */.      + n
6e60: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
6e70: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
6e80: 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20   azVar */.      
6e90: 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  + nCursor*sizeof
6ea0: 28 43 75 72 73 6f 72 2a 29 20 2b 20 31 20 20 20  (Cursor*) + 1   
6eb0: 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20   /* apCsr */.   
6ec0: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d   );.    if( !db-
6ed0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6ee0: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d  .      p->aMem--
6ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6f00: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
6f10: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
6f20: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
6f30: 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20  m;        /*    
6f40: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e     not from 0..n
6f50: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 70  Mem-1 */.      p
6f60: 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65  ->aVar = &p->aMe
6f70: 6d 5b 6e 4d 65 6d 2b 31 5d 3b 0a 20 20 20 20 20  m[nMem+1];.     
6f80: 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b   p->nVar = nVar;
6f90: 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20  .      p->okVar 
6fa0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  = 0;.      p->ap
6fb0: 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d  Arg = (Mem**)&p-
6fc0: 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  >aVar[nVar];.   
6fd0: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63     p->azVar = (c
6fe0: 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b  har**)&p->apArg[
6ff0: 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nArg];.      p->
7000: 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a  apCsr = (Cursor*
7010: 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72  *)&p->azVar[nVar
7020: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72  ];.      p->nCur
7030: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
7040: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
7050: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
7060: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
7070: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
7080: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
7090: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
70a0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e     }.      for(n
70b0: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
70c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d  ){.        p->aM
70d0: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
70e0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
70f0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
7100: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
7110: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
7120: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
7130: 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20  n=1; n<p->nMem; 
7140: 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  n++){.    assert
7150: 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d  ( p->aMem[n].db=
7160: 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  =db );.  }.#endi
7170: 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  f..  p->pc = -1;
7180: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
7190: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75  E_OK;.  p->uniqu
71a0: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  eCnt = 0;.  p->e
71b0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
71c0: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c  Abort;.  p->expl
71d0: 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e  ain |= isExplain
71e0: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
71f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
7200: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
7210: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
7220: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
7230: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
7240: 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74  5;.  p->openedSt
7250: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66  atement = 0;.#if
7260: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
7270: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
7280: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7290: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
72a0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
72b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
72c0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
72d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
72e0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  if.}../*.** Clos
72f0: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
7300: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
7310: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
7320: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
7330: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
7340: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7350: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
7360: 65 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43  e *p, Cursor *pC
7370: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
7380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
7390: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
73a0: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
73b0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
73c0: 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68  >pBt);.    /* Th
73d0: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
73e0: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
73f0: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
7400: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
7410: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
7420: 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ve. */.  }else i
7430: 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  f( pCx->pCursor 
7440: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
7450: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
7460: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
7470: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7480: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7490: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56  LE.  if( pCx->pV
74a0: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  tabCursor ){.   
74b0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
74c0: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
74d0: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75  r = pCx->pVtabCu
74e0: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rsor;.    const 
74f0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
7500: 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70  pModule = pCx->p
7510: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
7520: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
7530: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
7540: 65 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64  e3SafetyOff(p->d
7550: 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d  b);.    pModule-
7560: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
7570: 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  sor);.    (void)
7580: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
7590: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69  p->db);.    p->i
75a0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
75b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
75c0: 28 20 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65  ( !pCx->ephemPse
75d0: 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  udoTable ){.    
75e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
75f0: 3e 64 62 2c 20 70 43 78 2d 3e 70 44 61 74 61 29  >db, pCx->pData)
7600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
7610: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
7620: 20 65 78 63 65 70 74 20 66 6f 72 20 56 54 61 62   except for VTab
7630: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
7640: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69  e currently.** i
7650: 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
7660: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
7670: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
7680: 65 56 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b  eVtabs(Vdbe *p){
7690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
76a0: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65  p->apCsr==0 ) re
76b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
76c0: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
76d0: 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73 6f 72 20  ++){.    Cursor 
76e0: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
76f0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26  ];.    if( pC &&
7700: 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68   (!p->inVtabMeth
7710: 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62  od || !pC->pVtab
7720: 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
7730: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
7740: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
7750: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
7760: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
7770: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
7780: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
7790: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
77a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
77b0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
77c0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
77d0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
77e0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
77f0: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
7800: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
7810: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
7820: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
7830: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
7840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7850: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
7860: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
7870: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
7880: 62 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  b;.  closeAllCur
7890: 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65  sorsExceptActive
78a0: 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28  Vtabs(p);.  for(
78b0: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  i=1; i<=p->nMem;
78c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53 65   i++){.    MemSe
78d0: 74 54 79 70 65 46 6c 61 67 28 26 70 2d 3e 61 4d  tTypeFlag(&p->aM
78e0: 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  em[i], MEM_Null)
78f0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
7900: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d  emArray(&p->aMem
7910: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  [1], p->nMem);. 
7920: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
7930: 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29  Clear(&p->sFifo)
7940: 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65  ;.  if( p->conte
7950: 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66  xtStack ){.    f
7960: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e  or(i=0; i<p->con
7970: 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b  textStackTop; i+
7980: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
7990: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
79a0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
79b0: 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d  i].sFifo);.    }
79c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
79d0: 65 65 28 64 62 2c 20 70 2d 3e 63 6f 6e 74 65 78  ee(db, p->contex
79e0: 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70  tStack);.  }.  p
79f0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d  ->contextStack =
7a00: 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74   0;.  p->context
7a10: 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a  StackDepth = 0;.
7a20: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
7a30: 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69  kTop = 0;.  sqli
7a40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7a50: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
7a60: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
7a70: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
7a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
7a90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
7aa0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
7ab0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
7ac0: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
7ad0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
7ae0: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
7af0: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
7b00: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
7b10: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
7b20: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
7b30: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
7b40: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
7b50: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
7b60: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
7b70: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
7b80: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
7b90: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
7ba0: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
7bb0: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
7bc0: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
7bd0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
7be0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
7bf0: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
7c00: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
7c10: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
7c20: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
7c30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7c40: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
7c50: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
7c60: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
7c70: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e  ->nResColumn = n
7c80: 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e  ResColumn;.  p->
7c90: 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e  aColName = pColN
7ca0: 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69  ame = (Mem*)sqli
7cb0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7cc0: 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
7cd0: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
7ce0: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
7cf0: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
7d00: 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c   > 0 ){.    pCol
7d10: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  Name->flags = ME
7d20: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c  M_Null;.    pCol
7d30: 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  Name->db = p->db
7d40: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b  ;.    pColName++
7d50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
7d60: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  et the name of t
7d70: 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e  he idx'th column
7d80: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
7d90: 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  by the SQL state
7da0: 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d  ment..** zName m
7db0: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
7dc0: 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e   to a nul termin
7dd0: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  ated string..**.
7de0: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73  ** This call mus
7df0: 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20  t be made after 
7e00: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
7e10: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
7e20: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50  )..**.** If N==P
7e30: 34 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65 61  4_STATIC  it mea
7e40: 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73  ns that zName is
7e50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7e60: 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a  constant static.
7e70: 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65  ** string and we
7e80: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
7e90: 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69  he pointer. If i
7ea0: 74 20 69 73 20 50 34 5f 44 59 4e 41 4d 49 43 2c  t is P4_DYNAMIC,
7eb0: 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74   then .** the st
7ec0: 72 69 6e 67 20 69 73 20 66 72 65 65 64 20 75 73  ring is freed us
7ed0: 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
7ee0: 65 28 64 62 2c 20 29 20 77 68 65 6e 20 74 68 65  e(db, ) when the
7ef0: 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65   vdbe is finishe
7f00: 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74  d with.** it. Ot
7f10: 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73  herwise, N bytes
7f20: 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f   of zName are co
7f30: 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pied..*/.int sql
7f40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7f50: 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  me(Vdbe *p, int 
7f60: 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f  idx, int var, co
7f70: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
7f80: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72   int N){.  int r
7f90: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
7fa0: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
7fb0: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
7fc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
7fd0: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
7fe0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7ff0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8000: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8010: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
8020: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
8030: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
8040: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
8050: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
8060: 20 69 66 28 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d   if( N==P4_DYNAM
8070: 49 43 20 7c 7c 20 4e 3d 3d 50 34 5f 53 54 41 54  IC || N==P4_STAT
8080: 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  IC ){.    rc = s
8090: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
80a0: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
80b0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
80c0: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
80d0: 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TIC);.  }else{. 
80e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
80f0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
8100: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c  lName, zName, N,
8110: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c   SQLITE_UTF8,SQL
8120: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
8130: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
8140: 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34  LITE_OK && N==P4
8150: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
8160: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
8170: 26 3d 20 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29  &= (~MEM_Static)
8180: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
8190: 7a 4d 61 6c 6c 6f 63 20 3d 20 70 43 6f 6c 4e 61  zMalloc = pColNa
81a0: 6d 65 2d 3e 7a 3b 0a 20 20 7d 0a 20 20 72 65 74  me->z;.  }.  ret
81b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
81c0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
81d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
81e0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
81f0: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
8200: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
8210: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
8220: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
8230: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
8240: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
8250: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
8260: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
8270: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
8280: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
8290: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
82a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
82b0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
82c0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
82d0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
82e0: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
82f0: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
8300: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
8310: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
8320: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
8330: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
8340: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
8350: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
8360: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
8370: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
8380: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
8390: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
83a0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
83b0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
83c0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
83d0: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
83e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
83f0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
8400: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
8410: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
8420: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8430: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
8440: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
8450: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
8460: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
8470: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
8480: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
8490: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
84a0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
84b0: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
84c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
84d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
84e0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
84f0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
8500: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
8510: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
8520: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
8530: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
8540: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
8550: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
8560: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
8570: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
8580: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
8590: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
85a0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
85b0: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
85c0: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
85d0: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
85e0: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
85f0: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
8600: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
8610: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
8620: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
8630: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
8640: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
8650: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
8660: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
8670: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
8680: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
8690: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
86a0: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
86b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
86c0: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
86d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
86e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
86f0: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
8700: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
8710: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
8720: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
8730: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
8740: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
8750: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  ){.    (void)sql
8760: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
8770: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  );.    rc = db->
8780: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
8790: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
87a0: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
87b0: 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a  e3SafetyOn(db);.
87c0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
87d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
87e0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
87f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
8800: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
8810: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
8820: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
8830: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
8840: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
8850: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
8860: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
8870: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
8880: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
8890: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
88a0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
88b0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
88c0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
88d0: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
88e0: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
88f0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
8900: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
8910: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
8920: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
8930: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
8940: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
8950: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
8960: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
8970: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
8980: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
8990: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
89a0: 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69  ( 0==strlen(sqli
89b0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
89c0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
89d0: 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  Bt)) || nTrans<=
89e0: 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  1 ){.    for(i=0
89f0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
8a00: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
8a10: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
8a20: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8a30: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8a40: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
8a50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8a60: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
8a70: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
8a80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8a90: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
8aa0: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
8ab0: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
8ac0: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
8ad0: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
8ae0: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
8af0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
8b00: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
8b10: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
8b20: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
8b30: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
8b40: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
8b50: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
8b60: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
8b70: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
8b80: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
8b90: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
8ba0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
8bb0: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
8bc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
8bd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8be0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
8bf0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8c00: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8c10: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
8c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8c30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8c40: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
8c50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8c60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8c70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
8c80: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
8c90: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
8ca0: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
8cb0: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
8cc0: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
8cd0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
8ce0: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
8cf0: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
8d00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8d10: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
8d20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
8d30: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
8d40: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
8d50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8d60: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
8d70: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
8d80: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
8d90: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
8da0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
8db0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
8dc0: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
8dd0: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
8de0: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
8df0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
8e00: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
8e10: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
8e20: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
8e30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
8e40: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
8e50: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
8e60: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20      int res;..  
8e70: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
8e80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8e90: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f  e name */.    do
8ea0: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e   {.      u32 ran
8eb0: 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dom;.      sqlit
8ec0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
8ed0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
8ee0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
8ef0: 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20  sizeof(random), 
8f00: 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  &random);.      
8f10: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
8f20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
8f30: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
8f40: 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66  ile, random&0x7f
8f50: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
8f60: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
8f70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8f80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8f90: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
8fa0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
8fb0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
8fc0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
8fd0: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
8fe0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
8ff0: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
9000: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9010: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
9020: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
9030: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
9040: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9050: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
9060: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
9070: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
9080: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
9090: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
90a0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
90b0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
90c0: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
90d0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
90e0: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
90f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9100: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9120: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
9130: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9140: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
9150: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
9160: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
9170: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
9180: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
9190: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
91a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
91b0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
91c0: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
91d0: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
91e0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
91f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9200: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
9210: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
9220: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
9230: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
9240: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
9250: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
9260: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
9270: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
9280: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
9290: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
92a0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
92b0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
92c0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
92d0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
92e0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
92f0: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
9300: 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  ;   /* Ignore th
9310: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
9320: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
9330: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
9340: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
9350: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
9360: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
9370: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
9380: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
9390: 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20  if( zFile[0]==0 
93a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
93b0: 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20  Ignore :memory: 
93c0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
93d0: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
93e0: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
93f0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
9400: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
9410: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
9420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9440: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
9450: 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69  File, strlen(zFi
9460: 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
9470: 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
9480: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  = strlen(zFile)+
9490: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
94a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
94b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
94c0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
94d0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
94e0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
94f0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
9500: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
9510: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9520: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
9530: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9550: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9560: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
9570: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
9580: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
9590: 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
95a0: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
95b0: 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
95c0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
95d0: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
95e0: 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
95f0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
9600: 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 65 65  t);.    if( (nee
9610: 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 28  dSync .     && (
9620: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
9630: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
9640: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
9650: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
9660: 49 41 4c 29 29 0a 20 20 20 20 20 26 26 20 28 72  IAL)).     && (r
9670: 63 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  c=sqlite3OsSync(
9680: 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
9690: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53  SYNC_NORMAL))!=S
96a0: 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20  QLITE_OK) ){.   
96b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
96c0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
96d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
96e0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
96f0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
9700: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9710: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
9720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9730: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
9740: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
9750: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
9760: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
9770: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
9780: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
97a0: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
97b0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
97c0: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
97d0: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
97e0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
97f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9800: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
9810: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
9820: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
9830: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
9840: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
9850: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
9860: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
9870: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
9880: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
9890: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
98a0: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
98b0: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
98c0: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
98d0: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
98e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
98f0: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
9900: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
9910: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
9920: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
9930: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  re occured..    
9940: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9950: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
9960: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9970: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
9980: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
9990: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
99a0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
99b0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
99c0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
99d0: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
99e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
99f0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
9a00: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
9a10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9a20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
9a30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
9a40: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
9a50: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
9a60: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
9a70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9a80: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
9a90: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
9aa0: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
9ab0: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
9ac0: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
9ad0: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
9ae0: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
9af0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
9b00: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
9b10: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
9b20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9b30: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
9b40: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
9b50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9b60: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
9b70: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
9b80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
9b90: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9ba0: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
9bb0: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
9bc0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9bd0: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
9be0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
9bf0: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
9c00: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9c10: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
9c20: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
9c30: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
9c40: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
9c50: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
9c60: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
9c70: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
9c80: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
9c90: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
9ca0: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
9cb0: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
9cc0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
9cd0: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
9ce0: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
9cf0: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
9d00: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
9d10: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
9d20: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
9d30: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
9d40: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
9d50: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
9d60: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
9d70: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
9d80: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
9d90: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
9da0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
9db0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
9dc0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
9dd0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
9de0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
9df0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
9e00: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
9e10: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
9e20: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
9e30: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
9e40: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
9e50: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
9e60: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
9e70: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
9e80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
9e90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
9ea0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9eb0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
9ec0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
9ed0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
9ee0: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
9ef0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
9f00: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
9f10: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
9f20: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
9f30: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
9f40: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
9f50: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
9f60: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
9f70: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
9f80: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
9f90: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
9fa0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
9fb0: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
9fc0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
9fd0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
9fe0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
9ff0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
a000: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
a010: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
a020: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
a030: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
a040: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  cnt = 0;.  p = d
a050: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
a060: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
a070: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
a080: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
a090: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
a0a0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t++;.    }.    p
a0b0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
a0c0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
a0d0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
a0e0: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
a0f0: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
a100: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
a110: 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  f../*.** For eve
a120: 72 79 20 42 74 72 65 65 20 74 68 61 74 20 69 6e  ry Btree that in
a130: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
a140: 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a  tion db which .*
a150: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
a160: 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69  ied, "trip" or i
a170: 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68 20 63  nvalidate each c
a180: 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74  ursor in.** that
a190: 20 42 74 72 65 65 20 6d 69 67 68 74 20 68 61 76   Btree might hav
a1a0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
a1b0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 75 72 73  so that the curs
a1c0: 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20  or.** can never 
a1d0: 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20  be used again.  
a1e0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
a1f0: 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a  n a rollback.***
a200: 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61 76   occurs.  We hav
a210: 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68  e to trip all th
a220: 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c  e other cursors,
a230: 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20   even.** cursor 
a240: 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69  from other VMs i
a250: 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61  n different data
a260: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
a270: 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e  ,.** so that non
a280: 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f  e of them try to
a290: 20 75 73 65 20 74 68 65 20 64 61 74 61 20 61 74   use the data at
a2a0: 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77   which they.** w
a2b0: 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64  ere pointing and
a2c0: 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68   which now may h
a2d0: 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64  ave been changed
a2e0: 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72   due.** to the r
a2f0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  ollback..**.** R
a300: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 72  emember that a r
a310: 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65  ollback can dele
a320: 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65  te tables comple
a330: 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65  te and.** reorde
a340: 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f  r rootpages.  So
a350: 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
a360: 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61  cient just to sa
a370: 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ve.** the state 
a380: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
a390: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c  We have to inval
a3a0: 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  idate the cursor
a3b0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69  .** so that it i
a3c0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 67 61  s never used aga
a3d0: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
a3e0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72  id invalidateCur
a3f0: 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
a400: 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  rees(sqlite3 *db
a410: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
a420: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; i++){.    Btre
a440: 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69  e *p = db->aDb[i
a450: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
a460: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
a470: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
a480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
a490: 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
a4a0: 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  (p, SQLITE_ABORT
a4b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a4c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a4d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
a4e0: 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
a4f0: 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
a500: 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
a510: 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
a520: 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
a530: 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
a540: 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
a550: 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
a560: 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
a570: 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
a580: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
a590: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
a5a0: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
a5b0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
a5c0: 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
a5d0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
a5e0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
a5f0: 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
a600: 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
a610: 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
a620: 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
a630: 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
a640: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
a650: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
a660: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
a670: 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
a680: 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
a690: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
a6a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
a6b0: 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
a6c0: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
a6d0: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
a6e0: 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
a6f0: 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
a700: 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
a710: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
a720: 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
a730: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a740: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
a750: 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42    int (*xFunc)(B
a760: 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20  tree *pBt) = 0; 
a770: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
a780: 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72  call on each btr
a790: 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  ee backend */.  
a7a0: 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
a7b0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
a7c0: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
a7d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
a7e0: 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20   IOERR */..  /* 
a7f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
a800: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
a810: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
a820: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
a830: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
a840: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
a850: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
a860: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
a870: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
a880: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
a890: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
a8a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
a8b0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
a8c0: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
a8d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
a8e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
a8f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
a900: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
a910: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
a920: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a930: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
a940: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
a950: 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
a960: 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
a970: 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
a980: 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
a990: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
a9a0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
a9b0: 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
a9c0: 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
a9d0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
a9e0: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
a9f0: 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
aa00: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
aa10: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
aa20: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
aa30: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
aa40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
aa50: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
aa60: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
aa70: 62 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bs(p);.  if( p->
aa80: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
aa90: 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
aaa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
aab0: 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
aac0: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
aad0: 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
aae0: 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
aaf0: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
ab00: 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
ab10: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
ab20: 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
ab30: 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
ab40: 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
ab50: 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  c */..    /* Loc
ab60: 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
ab70: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
ab80: 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
ab90: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
aba0: 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78  Enter(&p->aMutex
abb0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
abc0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
abd0: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
abe0: 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
abf0: 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73  c & 0xff;.    is
ac00: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
ac10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
ac20: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
ac30: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
ac40: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
ac50: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
ac60: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
ac70: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
ac80: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
ac90: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
aca0: 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69   loop does stati
acb0: 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68  c analysis of th
acc0: 65 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77  e query to see w
acd0: 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20  hich of the.    
ace0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
acf0: 68 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20  hree categories 
ad00: 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20  it falls into:. 
ad10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ad20: 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20       Read-only. 
ad30: 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72       **     Quer
ad40: 79 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74  y with statement
ad50: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
ad60: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
ad70: 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  out statement jo
ad80: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20  urnal.      **. 
ad90: 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64       ** We could
ada0: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f   do something mo
adb0: 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20  re elegant than 
adc0: 74 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c  this static anal
add0: 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20  ysis (i.e..     
ade0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79   ** store the ty
adf0: 70 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70  pe of query as p
ae00: 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c  art of the compl
ae10: 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62  iation phase), b
ae20: 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ut .      ** han
ae30: 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f  dling malloc() o
ae40: 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20  r IO failure is 
ae50: 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65  a fairly obscure
ae60: 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20   edge case so . 
ae70: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
ae80: 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e  probably easier.
ae90: 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20   Todo: Might be 
aea0: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
aeb0: 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20  o reduce .      
aec0: 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76  ** code size a v
aed0: 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74  ery small amount
aee0: 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20   though....     
aef0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   */.      int no
af00: 74 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  tReadOnly = 0;. 
af10: 20 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65       int isState
af20: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ment = 0;.      
af30: 61 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c  assert(p->aOp ||
af40: 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20   p->nOp==0);.   
af50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
af60: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nOp; i++){ .   
af70: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
af80: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b  aOp[i].opcode ){
af90: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
afa0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a  OP_Transaction:.
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 52              notR
afc0: 65 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f  eadOnly |= p->aO
afd0: 70 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20  p[i].p2;.       
afe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aff0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74        case OP_St
b000: 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20  atement:.       
b010: 20 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74       isStatement
b020: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
b030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b040: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a   }.      }..   .
b050: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
b060: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
b070: 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20  nly, we need do 
b080: 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61  no rollback at a
b090: 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ll. Otherwise,. 
b0a0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20       ** proceed 
b0b0: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
b0c0: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
b0d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 6f   */.      if( no
b0e0: 74 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  tReadOnly || mrc
b0f0: 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
b100: 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
b110: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
b120: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26  IOERR_BLOCKED &&
b130: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
b140: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
b150: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
b160: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
b170: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
b180: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
b190: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 28 6d     } else if( (m
b1a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
b1b0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
b1c0: 46 55 4c 4c 29 20 26 26 20 69 73 53 74 61 74 65  FULL) && isState
b1d0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
b1e0: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
b1f0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
b200: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  mt;.        }els
b210: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
b220: 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
b230: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
b240: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
b250: 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
b260: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
b270: 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
b280: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
b290: 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
b2a0: 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
b2b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b2c0: 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
b2d0: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
b2e0: 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
b2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
b300: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
b310: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
b320: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
b330: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b340: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
b350: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
b360: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
b370: 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
b380: 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74  y active vdbe, t
b390: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f  hen.    ** we do
b3a0: 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
b3b0: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
b3c0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
b3d0: 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
b3e0: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
b3f0: 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
b400: 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
b410: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
b420: 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
b430: 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65  above has occure
b440: 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
b450: 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
b460: 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56  t && db->activeV
b470: 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  dbeCnt==1 ){.   
b480: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
b490: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
b4a0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
b4b0: 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
b4c0: 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
b4d0: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
b4e0: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
b4f0: 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65  ue, and the vdbe
b500: 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20   program was .  
b510: 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73        ** success
b520: 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f  ful or hit an 'O
b530: 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
b540: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  nt. This means a
b550: 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
b560: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
b570: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b580: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62      int rc = vdb
b590: 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
b5a0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
b5b0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
b5c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b5d0: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c  BtreeMutexArrayL
b5e0: 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29  eave(&p->aMutex)
b5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
b600: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
b610: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
b620: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
b640: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
b650: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
b660: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
b670: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b680: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
b690: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
b6a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
b6b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
b6d0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
b6e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
b6f0: 66 28 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20  f( !xFunc ){.   
b700: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
b710: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
b720: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
b730: 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  il ){.        if
b740: 28 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65  ( p->openedState
b750: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
b760: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
b770: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
b780: 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  ;.        } .   
b790: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
b7a0: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
b7b0: 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
b7c0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
b7d0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
b7e0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
b7f0: 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
b800: 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
b810: 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20  iedBtrees(db);. 
b820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
b830: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
b840: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
b850: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
b860: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
b870: 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e  /* If xFunc is n
b880: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
b890: 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74   is one of sqlit
b8a0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
b8b0: 74 6d 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  tmt or.    ** sq
b8c0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
b8d0: 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e  Stmt. Call it on
b8e0: 63 65 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65  ce on each backe
b8f0: 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  nd. If an error 
b900: 6f 63 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e  occurs.    ** an
b910: 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  d the return cod
b920: 65 20 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54  e is still SQLIT
b930: 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65  E_OK, set the re
b940: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65  turn code to the
b950: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f   new.    ** erro
b960: 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  r value..    */.
b970: 20 20 20 20 61 73 73 65 72 74 28 21 78 46 75 6e      assert(!xFun
b980: 63 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63  c ||.      xFunc
b990: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
b9a0: 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20  mmitStmt ||.    
b9b0: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
b9c0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
b9d0: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72  t.    );.    for
b9e0: 28 69 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69  (i=0; xFunc && i
b9f0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
ba00: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
ba10: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
ba20: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
ba30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
ba40: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ba50: 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20  xFunc(pBt);.    
ba60: 20 20 20 20 69 66 28 20 72 63 20 26 26 20 28 70      if( rc && (p
ba70: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ba80: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
ba90: 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a  _CONSTRAINT) ){.
baa0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
bab0: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
bac0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bad0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
bae0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
baf0: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
bb00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
bb10: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
bb20: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
bb30: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
bb40: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
bb50: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
bb60: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
bb70: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
bb80: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
bb90: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
bba0: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
bbb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
bbc0: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
bbd0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
bbe0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
bbf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
bc00: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
bc10: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
bc20: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
bc30: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
bc40: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
bc50: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
bc60: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
bc70: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
bc80: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
bc90: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
bca0: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
bcb0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
bcc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
bcd0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
bce0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
bcf0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
bd00: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
bd10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
bd20: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
bd30: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
bd40: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
bd50: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
bd60: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
bd70: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
bd80: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
bd90: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
bda0: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
bdb0: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
bdc0: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
bdd0: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
bde0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
bdf0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
be00: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
be10: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
be20: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
be30: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
be40: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
be50: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
be60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
be70: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
be80: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
be90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bea0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
beb0: 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
bec0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
bed0: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
bee0: 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
bef0: 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
bf00: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
bf10: 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
bf20: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
bf30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
bf40: 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
bf50: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
bf60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
bf70: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
bf80: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
bf90: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
bfa0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
bfb0: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
bfc0: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
bfd0: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
bfe0: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
bff0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
c000: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
c010: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
c020: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
c030: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
c040: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
c050: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
c060: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
c070: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
c080: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
c090: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
c0a0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
c0b0: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
c0c0: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
c0d0: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
c0e0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
c0f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c100: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
c110: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c120: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
c130: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
c140: 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
c150: 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
c160: 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
c170: 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
c180: 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
c190: 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
c1a0: 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
c1b0: 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
c1c0: 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
c1d0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
c1e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c1f0: 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64  Halt(p);.  (void
c200: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
c210: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
c220: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
c230: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
c240: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
c250: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
c260: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
c270: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
c280: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
c290: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
c2a0: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
c2b0: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
c2c0: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
c2d0: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
c2e0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
c2f0: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
c300: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
c310: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
c320: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
c330: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
c340: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
c350: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
c360: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
c370: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c380: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
c390: 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73  Err,-1,p->zErrMs
c3a0: 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51  g,SQLITE_UTF8,SQ
c3b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
c3c0: 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  .      db->errCo
c3d0: 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20  de = p->rc;.    
c3e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c3f0: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
c400: 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  .      p->zErrMs
c410: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
c420: 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
c430: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c440: 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  (db, p->rc, 0);.
c450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c460: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c470: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
c480: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
c490: 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
c4a0: 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
c4b0: 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
c4c0: 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
c4d0: 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
c4e0: 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
c4f0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
c500: 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
c510: 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
c520: 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
c530: 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
c540: 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
c550: 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
c560: 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
c570: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
c580: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
c590: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c5a0: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
c5b0: 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
c5c0: 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
c5d0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
c5e0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
c5f0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
c600: 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
c610: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
c620: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
c630: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
c640: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
c650: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
c660: 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
c670: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
c680: 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
c690: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
c6a0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
c6b0: 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
c6c0: 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
c6d0: 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
c6e0: 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
c6f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
c700: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
c710: 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
c720: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
c730: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
c740: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
c750: 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
c760: 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
c770: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
c780: 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  , "\n");.      f
c790: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
c7a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c7b0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36  fprintf(out, "%6
c7c0: 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22  d %10lld %8lld "
c7d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
c7e0: 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
c7f0: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
c800: 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
c810: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
c820: 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
c830: 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
c840: 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
c850: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
c860: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
c870: 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
c880: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
c890: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
c8a0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
c8b0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
c8c0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
c8d0: 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a  p->aborted = 0;.
c8e0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
c8f0: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
c900: 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
c910: 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
c920: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
c930: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
c940: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
c950: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
c960: 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
c970: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
c980: 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
c990: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c9a0: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
c9b0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
c9c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c9d0: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
c9e0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
c9f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
ca00: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
ca10: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
ca20: 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
ca30: 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
ca40: 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
ca50: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
ca60: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
ca70: 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
ca80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
ca90: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
caa0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
cab0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cac0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ../*.** Call the
cad0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
cae0: 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74  each auxdata ent
caf0: 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20  ry in pVdbeFunc 
cb00: 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65  for which.** the
cb10: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
cb20: 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c  it in mask is cl
cb30: 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e  ear.  Auxdata en
cb40: 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a  tries beyond 31.
cb50: 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65  ** are always de
cb60: 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73  stroyed.  To des
cb70: 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61  troy all auxdata
cb80: 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74   entries, call t
cb90: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  his.** routine w
cba0: 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a  ith mask==0..*/.
cbb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
cbc0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
cbd0: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
cbe0: 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  c, int mask){.  
cbf0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
cc00: 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e  ; i<pVdbeFunc->n
cc10: 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Aux; i++){.    s
cc20: 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70  truct AuxData *p
cc30: 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63  Aux = &pVdbeFunc
cc40: 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20  ->apAux[i];.    
cc50: 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d  if( (i>31 || !(m
cc60: 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20  ask&(1<<i))) && 
cc70: 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20  pAux->pAux ){.  
cc80: 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
cc90: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
cca0: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
ccb0: 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
ccc0: 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e    }.      pAux->
ccd0: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
cce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
ccf0: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
cd00: 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
cd10: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
cd20: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
cd30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
cd40: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
cd50: 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
cd60: 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  db;.  if( p->pPr
cd70: 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
cd80: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
cd90: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
cda0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
cdb0: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
cdc0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
cdd0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
cde0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
cdf0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
ce00: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
ce10: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
ce20: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e     Op *pOp = p->
ce30: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
ce40: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c  ; i<p->nOp; i++,
ce50: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
ce60: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
ce70: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
ce80: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
ce90: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
cea0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ceb0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
cec0: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
ced0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
cee0: 65 65 28 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a  ee(db, p->aOp);.
cef0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
cf00: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
cf10: 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74  ->nVar);.  sqlit
cf20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
cf30: 61 4c 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70  aLabel);.  if( p
cf40: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  ->aMem ){.    sq
cf50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cf60: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20  &p->aMem[1]);.  
cf70: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
cf80: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
cf90: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
cfa0: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
cfb0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
cfc0: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
cfd0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
cfe0: 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e   p->zSql);.  p->
cff0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
d000: 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74  IC_DEAD;.  sqlit
d010: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
d020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d  .}../*.** If a M
d030: 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
d040: 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
d050: 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
d060: 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
d070: 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74  MoveTo now.  Ret
d080: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
d090: 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f  e.  If no MoveTo
d0a0: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69   is pending, thi
d0b0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65  s.** routine doe
d0c0: 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65  s nothing and re
d0d0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
d0e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d0f0: 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
d100: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
d110: 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
d120: 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
d130: 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
d140: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
d150: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
d160: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
d170: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
d180: 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
d190: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d1a0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e  3BtreeMoveto(p->
d1b0: 70 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 20 70  pCursor, 0, 0, p
d1c0: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
d1d0: 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
d1e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d1f0: 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b  ;.    *p->pIncrK
d200: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c  ey = 0;.    p->l
d210: 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f  astRowid = keyTo
d220: 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  Int(p->movetoTar
d230: 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  get);.    p->row
d240: 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
d250: 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  =0;.    if( res<
d260: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d270: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
d280: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  (p->pCursor, &re
d290: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
d2a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d2b0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
d2c0: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
d2d0: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
d2e0: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  +;.#endif.    p-
d2f0: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
d300: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
d310: 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
d320: 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  STALE;.  }else i
d330: 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b  f( p->pCursor ){
d340: 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
d350: 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
d360: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
d370: 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
d380: 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
d390: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
d3a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
d3b0: 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
d3c0: 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
d3d0: 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
d3e0: 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
d3f0: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
d400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
d410: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d420: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
d430: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
d440: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d450: 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
d460: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
d470: 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
d480: 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
d490: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
d4a0: 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
d4b0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
d4c0: 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
d4d0: 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
d4e0: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
d4f0: 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
d500: 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
d510: 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
d520: 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
d530: 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
d540: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
d550: 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
d560: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
d570: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
d580: 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
d590: 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
d5a0: 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
d5b0: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
d5c0: 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
d5d0: 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
d5e0: 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
d5f0: 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
d600: 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
d610: 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
d620: 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
d630: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
d640: 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
d650: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
d660: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
d670: 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
d680: 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
d690: 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
d6a0: 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
d6b0: 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
d6c0: 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
d6d0: 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
d6e0: 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
d6f0: 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
d700: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d710: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
d720: 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
d730: 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
d740: 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
d750: 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
d760: 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
d770: 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
d780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
d790: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d7a0: 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
d7b0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d7e0: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
d810: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
d820: 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
d840: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
d850: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
d860: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
d870: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
d880: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
d890: 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
d8c0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
d8d0: 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
d8e0: 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
d8f0: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
d900: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
d930: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
d940: 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
d960: 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
d970: 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
d9a0: 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
d9b0: 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d9e0: 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
d9f0: 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
da20: 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
da30: 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
da40: 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
da50: 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
da60: 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
da70: 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
da80: 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
da90: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
daa0: 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
dab0: 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
dac0: 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
dad0: 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
dae0: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
daf0: 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
db00: 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
db10: 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
db20: 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
db30: 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
db40: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
db50: 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
db60: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
db70: 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
db80: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
db90: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
dba0: 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
dbb0: 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
dbc0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
dbd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
dbe0: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
dbf0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
dc00: 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
dc10: 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
dc20: 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
dc30: 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
dc40: 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
dc50: 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
dc60: 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
dc70: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
dc80: 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
dc90: 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
dca0: 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
dcb0: 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d  eturn 8+i;.    }
dcc0: 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d  .    u = i<0 ? -
dcd0: 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75  i : i;.    if( u
dce0: 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
dcf0: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
dd00: 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
dd10: 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
dd20: 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
dd30: 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
dd40: 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
dd50: 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
dd60: 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
dd70: 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
dd80: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
dd90: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
dda0: 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
ddb0: 73 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d 45  ssert( flags&(ME
ddc0: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
ddd0: 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e  );.  n = pMem->n
dde0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
ddf0: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
de00: 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a  n += pMem->u.i;.
de10: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e    }.  assert( n>
de20: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
de30: 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
de40: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
de50: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
de60: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
de70: 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
de80: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
de90: 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
dea0: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
deb0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
dec0: 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
ded0: 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
dee0: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
def0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
df00: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
df10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
df20: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
df30: 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
df40: 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
df50: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
df60: 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
df70: 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
df80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
df90: 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
dfa0: 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
dfb0: 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
dfc0: 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
dfd0: 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
dfe0: 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
dff0: 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
e000: 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
e010: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
e020: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
e030: 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
e040: 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
e050: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
e060: 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
e070: 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
e080: 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
e090: 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
e0a0: 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
e0b0: 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
e0c0: 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
e0d0: 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
e0e0: 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
e0f0: 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
e100: 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
e110: 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
e120: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
e130: 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
e140: 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
e150: 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
e160: 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
e170: 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
e180: 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
e190: 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
e1a0: 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
e1b0: 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
e1c0: 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
e1d0: 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
e1e0: 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
e1f0: 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
e200: 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
e210: 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
e220: 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
e230: 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
e240: 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
e250: 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
e260: 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
e270: 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
e280: 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
e290: 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
e2a0: 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
e2b0: 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
e2c0: 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
e2d0: 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
e2e0: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
e2f0: 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
e300: 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
e310: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
e320: 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
e330: 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
e340: 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
e350: 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
e360: 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
e370: 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
e380: 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
e390: 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
e3a0: 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
e3b0: 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
e3c0: 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
e3d0: 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
e3e0: 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
e3f0: 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
e400: 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
e410: 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
e420: 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
e430: 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
e440: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
e450: 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
e460: 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
e470: 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
e480: 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
e490: 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
e4a0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
e4b0: 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
e4c0: 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
e4d0: 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
e4e0: 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
e4f0: 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
e500: 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
e510: 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
e520: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
e530: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
e540: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
e550: 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
e560: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
e570: 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
e580: 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
e590: 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
e5a0: 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
e5b0: 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
e5c0: 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
e5d0: 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
e5e0: 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
e5f0: 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
e600: 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
e610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
e620: 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
e630: 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
e640: 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
e650: 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
e660: 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
e670: 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
e680: 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
e690: 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
e6a0: 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
e6b0: 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
e6c0: 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
e6d0: 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
e6e0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e6f0: 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
e700: 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
e710: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
e720: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
e730: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
e740: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
e750: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
e760: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
e770: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
e780: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
e790: 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
e7a0: 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
e7b0: 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
e7c0: 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
e7d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
e7e0: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
e7f0: 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
e800: 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
e810: 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75  t in buf[].  nBu
e820: 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  f must always be
e830: 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  .** large enough
e840: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
e850: 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65  ire field.  Exce
e860: 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64  pt, if the field
e870: 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69   is.** a blob wi
e880: 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  th a zero-filled
e890: 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b   tail, then buf[
e8a0: 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20  ] might be just 
e8b0: 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a  the right.** siz
e8c0: 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74  e to hold everyt
e8d0: 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20  hing except for 
e8e0: 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
e8f0: 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a  tail.  If buf[].
e900: 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65  ** is only big e
e910: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
e920: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69  e non-zero prefi
e930: 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  x, then only wri
e940: 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69  te that.** prefi
e950: 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42  x into buf[].  B
e960: 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c  ut if buf[] is l
e970: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
e980: 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20  old both the.** 
e990: 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74  prefix and the t
e9a0: 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74  ail then write t
e9b0: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65  he prefix and se
e9c0: 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c  t the tail to al
e9d0: 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a  l.** zeros..**.*
e9e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
e9f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
ea00: 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
ea10: 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
ea20: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
ea30: 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
ea40: 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
ea50: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
ea60: 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
ea70: 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
ea80: 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
ea90: 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73  buf[]..*/ .int s
eaa0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
eab0: 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74  Put(u8 *buf, int
eac0: 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   nBuf, Mem *pMem
ead0: 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
eae0: 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c  t){.  u32 serial
eaf0: 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
eb00: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d  dbeSerialType(pM
eb10: 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  em, file_format)
eb20: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20  ;.  int len;..  
eb30: 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
eb40: 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
eb50: 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
eb60: 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
eb70: 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69      u64 v;.    i
eb80: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  nt i;.    if( se
eb90: 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
eba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
ebb0: 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
ebc0: 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
ebd0: 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
ebe0: 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
ebf0: 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
ec00: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
ec10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ec20: 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
ec30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
ec40: 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
ec50: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
ec60: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
ec70: 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42   assert( len<=nB
ec80: 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  uf );.    while(
ec90: 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
eca0: 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b  f[i] = (v&0xFF);
ecb0: 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
ecc0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
ecd0: 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
ece0: 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
ecf0: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
ed00: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
ed10: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
ed20: 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
ed30: 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
ed40: 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20  >u.i:0).        
ed50: 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56       == sqlite3V
ed60: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
ed70: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
ed80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
ed90: 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
eda0: 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
edb0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
edc0: 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
edd0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
ede0: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
edf0: 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
ee00: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Mem->u.i;.      
ee10: 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a  if( len>nBuf ){.
ee20: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42          len = nB
ee30: 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  uf;.      }.    
ee40: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d    memset(&buf[pM
ee50: 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70  em->n], 0, len-p
ee60: 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20  Mem->n);.    }. 
ee70: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
ee80: 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
ee90: 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
eea0: 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
eeb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
eec0: 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
eed0: 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
eee0: 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
eef0: 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
ef00: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
ef10: 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
ef20: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
ef30: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
ef40: 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ad..*/ .int sqli
ef50: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
ef60: 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
ef70: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
ef80: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
ef90: 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
efa0: 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
efb0: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
efc0: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
efd0: 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
efe0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
f010: 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
f020: 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
f030: 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
f040: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
f050: 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
f060: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
f070: 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
f080: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
f090: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
f0a0: 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
f0b0: 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
f0c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f0d0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
f0e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f0f0: 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
f100: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
f110: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
f120: 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63  >u.i = (signed c
f130: 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20  har)buf[0];.    
f140: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f150: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
f160: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
f170: 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
f180: 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
f190: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
f1a0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
f1b0: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
f1c0: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
f1d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f1e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
f1f0: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
f200: 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
f210: 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
f220: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
f230: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
f240: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
f250: 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
f260: 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
f270: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f280: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
f2a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
f2b0: 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
f2c0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f2d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f2e0: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
f2f0: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
f300: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
f310: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
f320: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f330: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
f340: 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
f350: 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
f360: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
f370: 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
f380: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
f390: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
f3a0: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
f3b0: 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
f3c0: 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
f3d0: 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
f3e0: 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
f3f0: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
f400: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
f410: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
f420: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f430: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
f440: 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
f450: 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
f460: 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
f470: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
f480: 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
f490: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
f4a0: 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
f4b0: 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
f4c0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
f4d0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
f4e0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
f4f0: 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
f500: 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
f510: 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
f520: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
f530: 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
f540: 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
f550: 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
f560: 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
f570: 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
f580: 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e  s.      ** defin
f590: 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
f5a0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
f5b0: 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
f5c0: 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65  mixed.      ** e
f5d0: 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndian..      */.
f5e0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
f5f0: 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
f600: 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
f610: 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  2;.      static 
f620: 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
f630: 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34  = 1.0;.      u64
f640: 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20   t2 = t1;.      
f650: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
f660: 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20  loat(t2);.      
f670: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
f680: 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
f690: 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
f6a0: 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
f6b0: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  0 );.#endif..   
f6c0: 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c     x = (buf[0]<<
f6d0: 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
f6e0: 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
f6f0: 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
f700: 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34   y = (buf[4]<<24
f710: 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29  ) | (buf[5]<<16)
f720: 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c   | (buf[6]<<8) |
f730: 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78   buf[7];.      x
f740: 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
f750: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
f760: 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
f770: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
f780: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
f790: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f7a0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
f7c0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
f7d0: 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
f7e0: 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  em->r)==8 );.   
f7f0: 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
f800: 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
f810: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d        memcpy(&pM
f820: 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
f830: 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70  f(x));.        p
f840: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
f850: 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
f860: 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
f870: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
f880: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
f890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f8a0: 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
f8b0: 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
f8c0: 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
f8d0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
f8e0: 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
f8f0: 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
f900: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f910: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f920: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
f930: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
f940: 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c  nt len = (serial
f950: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
f960: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
f970: 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
f980: 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20  pMem->n = len;. 
f990: 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
f9a0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
f9b0: 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
f9c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
f9d0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
f9e0: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
f9f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fa00: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
fa10: 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
fa20: 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  Ephem;.      }. 
fa30: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b       return len;
fa40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fa50: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
fa60: 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
fa70: 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
fa80: 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
fa90: 79 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a  y[], parse the.*
faa0: 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20  * record into a 
fab0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
fac0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
fad0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
fae0: 2a 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  * that structure
faf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
fb00: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67  ing function mig
fb10: 68 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61  ht provide szSpa
fb20: 63 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ce bytes of memo
fb30: 72 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70  ry.** space at p
fb40: 53 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61  Space.  This spa
fb50: 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ce can be used t
fb60: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
fb70: 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65  ned.** VDbeParse
fb80: 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
fb90: 65 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65  e if it is large
fba0: 20 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20   enough.  If it 
fbb0: 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e  is.** not big en
fbc0: 6f 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f  ough, space is o
fbd0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
fbe0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
fbf0: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
fc00: 64 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  d structure shou
fc10: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20  ld be closed by 
fc20: 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  a call to.** sql
fc30: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
fc40: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a  packedRecord()..
fc50: 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  */ .UnpackedReco
fc60: 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52  rd *sqlite3VdbeR
fc70: 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
fc80: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
fc90: 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
fca0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
fcb0: 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
fcc0: 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
fcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fce0: 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
fcf0: 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
fd00: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
fd10: 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
fd20: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 76 6f 69 64  record */.  void
fd30: 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
fd40: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69     /* Space avai
fd50: 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65  lable to hold re
fd60: 73 75 6c 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a  sulting object *
fd70: 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20  /.  int szSpace 
fd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fd90: 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
fda0: 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
fdb0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
fdc0: 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
fdd0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
fde0: 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63   *)pKey;.  Unpac
fdf0: 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20  kedRecord *p;.  
fe00: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
fe10: 20 69 64 78 2c 20 64 3b 0a 20 20 75 31 36 20 75   idx, d;.  u16 u
fe20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe30: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
fe40: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fe50: 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
fe60: 20 2a 70 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73   *pMem;.  .  ass
fe70: 65 72 74 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29  ert( sizeof(Mem)
fe80: 3e 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20  >sizeof(*p) );. 
fe90: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
fea0: 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
feb0: 6e 46 69 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28  nField+2);.  if(
fec0: 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29   nByte>szSpace )
fed0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
fee0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
fef0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
ff00: 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
ff10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
ff20: 70 2d 3e 6e 65 65 64 46 72 65 65 20 3d 20 31 3b  p->needFree = 1;
ff30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
ff40: 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 70 2d  = pSpace;.    p-
ff50: 3e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  >needFree = 0;. 
ff60: 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   }.  p->pKeyInfo
ff70: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
ff80: 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
ff90: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b  nfo->nField + 1;
ffa0: 0a 20 20 70 2d 3e 6e 65 65 64 44 65 73 74 72 6f  .  p->needDestro
ffb0: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d  y = 1;.  p->aMem
ffc0: 20 3d 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d   = pMem = &((Mem
ffd0: 2a 29 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d  *)p)[1];.  idx =
ffe0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
fff0: 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
10000 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
10010 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
10020 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65  Hdr && u<p->nFie
10030 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
10040 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
10050 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
10060 33 32 28 20 61 4b 65 79 2b 69 64 78 2c 20 73 65  32( aKey+idx, se
10070 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
10080 69 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73  if( d>=nKey && s
10090 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
100a0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
100b0 79 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  ype)>0 ) break;.
100c0 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
100d0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
100e0 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
100f0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
10100 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
10110 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
10120 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
10130 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
10140 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
10150 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
10160 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
10170 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 70      u++;.  }.  p
10180 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20  ->nField = u;.  
10190 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b  return (void*)p;
101a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
101b0 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20  outine destroys 
101c0 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  a UnpackedRecord
101d0 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
101e0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
101f0 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
10200 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
10210 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
10220 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 44 65     if( p->needDe
10230 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 69  stroy ){.      i
10240 6e 74 20 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20  nt i;.      Mem 
10250 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  *pMem;.      for
10260 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d  (i=0, pMem=p->aM
10270 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b  em; i<p->nField;
10280 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
10290 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d         if( pMem-
102a0 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
102b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102c0 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
102d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
102e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
102f0 66 28 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 29  f( p->needFree )
10300 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
10310 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66  bFree(p->pKeyInf
10320 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  o->db, p);.    }
10330 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
10340 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
10350 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
10360 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
10370 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
10380 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
10390 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
103a0 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
103b0 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
103c0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
103d0 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79  integer if {nKey
103e0 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73  1, pKey1} is les
103f0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
10400 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
10410 74 68 61 6e 20 70 50 4b 65 79 32 2e 20 20 54 68  than pPKey2.  Th
10420 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
10430 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
10440 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
10450 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  y th OP_MakeReco
10460 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
10470 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
10480 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
10490 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
104a0 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
104b0 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
104c0 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
104d0 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
104e0 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
104f0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
10500 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
10510 65 6c 64 73 2e 0a 2a 2a 20 42 75 74 20 69 66 20  elds..** But if 
10520 74 68 65 20 6c 65 6e 67 74 68 73 20 64 69 66 66  the lengths diff
10530 65 72 2c 20 4b 65 79 32 20 6d 75 73 74 20 62 65  er, Key2 must be
10540 20 74 68 65 20 73 68 6f 72 74 65 72 20 6f 66 20   the shorter of 
10550 74 68 65 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 48  the two..**.** H
10560 69 73 74 6f 72 69 63 61 6c 20 6e 6f 74 65 3a 20  istorical note: 
10570 49 6e 20 65 61 72 6c 69 65 72 20 76 65 72 73 69  In earlier versi
10580 6f 6e 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ons of this rout
10590 69 6e 65 20 62 6f 74 68 20 4b 65 79 31 0a 2a 2a  ine both Key1.**
105a0 20 61 6e 64 20 4b 65 79 32 20 77 65 72 65 20 62   and Key2 were b
105b0 6c 6f 62 73 20 6f 62 74 61 69 6e 65 64 20 66 72  lobs obtained fr
105c0 6f 6d 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  om OP_MakeRecord
105d0 2e 20 20 42 75 74 20 77 65 20 66 6f 75 6e 64 0a  .  But we found.
105e0 2a 2a 20 74 68 61 74 20 69 6e 20 74 79 70 69 63  ** that in typic
105f0 61 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  al use the same 
10600 4b 65 79 32 20 77 6f 75 6c 64 20 62 65 20 73 75  Key2 would be su
10610 62 6d 69 74 74 65 64 20 6d 75 6c 74 69 70 6c 65  bmitted multiple
10620 20 74 69 6d 65 73 0a 2a 2a 20 69 6e 20 61 20 72   times.** in a r
10630 6f 77 2e 20 20 53 6f 20 61 6e 20 6f 70 74 69 6d  ow.  So an optim
10640 69 7a 61 74 69 6f 6e 20 77 61 73 20 61 64 64 65  ization was adde
10650 64 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 4b  d to parse the K
10660 65 79 32 20 6b 65 79 0a 2a 2a 20 73 65 70 61 72  ey2 key.** separ
10670 61 74 65 6c 79 20 61 6e 64 20 73 75 62 6d 69 74  ately and submit
10680 20 74 68 65 20 70 61 72 73 65 64 20 76 65 72 73   the parsed vers
10690 69 6f 6e 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ion.  In this wa
106a0 79 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 70  y, we avoid.** p
106b0 61 72 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  arsing the same 
106c0 4b 65 79 32 20 6d 75 6c 74 69 70 6c 65 20 74 69  Key2 multiple ti
106d0 6d 65 73 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2f  mes in a row..*/
106e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
106f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
10700 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
10710 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a  t void *pKey1, .
10720 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
10730 20 2a 70 50 4b 65 79 32 0a 29 7b 0a 20 20 75 33   *pPKey2.){.  u3
10740 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
10750 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
10760 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
10770 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
10780 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
10790 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
107a0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
107b0 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
107c0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
107d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
107e0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
107f0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
10800 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
10810 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
10820 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
10830 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
10840 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
10850 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
10860 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
10870 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
10880 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
10890 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
108a0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
108b0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
108c0 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
108d0 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61  ->db;.  mem1.fla
108e0 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a  gs = 0;.  mem1.z
108f0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20  Malloc = 0;.  . 
10900 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
10910 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
10920 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  1);.  d1 = szHdr
10930 31 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b  1;.  nField = pK
10940 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
10950 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
10960 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
10970 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
10980 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
10990 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
109a0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
109b0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
109c0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
109d0 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
109e0 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
109f0 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
10a00 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66  _type1 );.    if
10a10 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
10a20 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10a30 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
10a40 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
10a50 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
10a60 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
10a70 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
10a80 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
10a90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
10aa0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
10ab0 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
10ac0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
10ad0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
10ae0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10af0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
10b00 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
10b10 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20  aMem[i],.       
10b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b30 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70      i<nField ? p
10b40 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
10b50 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ] : 0);.    if( 
10b60 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  rc!=0 ){.      b
10b70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10b80 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  i++;.  }.  if( m
10b90 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  em1.zMalloc ) sq
10ba0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
10bb0 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f  ase(&mem1);..  /
10bc0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  * One of the key
10bd0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
10be0 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  lds, but all the
10bf0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
10c00 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65  at point.  ** we
10c10 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
10c20 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73   incrKey flag is
10c30 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
10c40 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20  second key is.  
10c50 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61  ** treated as la
10c60 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rger..  */.  if(
10c70 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
10c80 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72  ( pKeyInfo->incr
10c90 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
10ca0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
10cb0 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70  if( !pKeyInfo->p
10cc0 72 65 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a  refixIsEqual ){.
10cd0 20 20 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65        if( d1<nKe
10ce0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  y1 ){.        rc
10cf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10d00 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10d10 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
10d20 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e  rder && i<pKeyIn
10d30 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20  fo->nField.     
10d40 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4b 65            && pKe
10d50 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
10d60 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[i] ){.    rc =
10d70 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   -rc;.  }..  ret
10d80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10d90 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
10da0 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
10db0 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74  composed using t
10dc0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
10dd0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20   opcode..** The 
10de0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
10df0 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  is record should
10e00 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28   be an integer (
10e10 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20  specifically.** 
10e20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64  an integer rowid
10e30 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
10e40 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
10e50 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a  ber of bytes in.
10e60 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e  ** that integer.
10e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10e80 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63  dbeIdxRowidLen(c
10e90 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 2c 20 69  onst u8 *aKey, i
10ea0 6e 74 20 6e 4b 65 79 2c 20 69 6e 74 20 2a 70 52  nt nKey, int *pR
10eb0 6f 77 69 64 4c 65 6e 29 7b 0a 20 20 75 33 32 20  owidLen){.  u32 
10ec0 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
10ed0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
10ee0 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
10ef0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
10f00 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
10f10 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 28 76 6f   rowid */..  (vo
10f20 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 61  id)getVarint32(a
10f30 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 69  Key, szHdr);.  i
10f40 66 28 20 73 7a 48 64 72 3e 6e 4b 65 79 20 29 7b  f( szHdr>nKey ){
10f50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10f60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
10f70 0a 20 20 7d 0a 20 20 28 76 6f 69 64 29 67 65 74  .  }.  (void)get
10f80 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
10f90 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
10fa0 69 64 29 3b 0a 20 20 2a 70 52 6f 77 69 64 4c 65  id);.  *pRowidLe
10fb0 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  n = sqlite3VdbeS
10fc0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
10fd0 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  eRowid);.  retur
10fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 20  n SQLITE_OK;.}. 
10ff0 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
11000 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
11010 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
11020 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
11030 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
11040 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
11050 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
11060 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
11070 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
11080 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
11090 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
110a0 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
110b0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
110c0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
110d0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
110e0 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  dxRowid(BtCursor
110f0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
11100 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
11110 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
11120 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
11130 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11140 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
11150 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
11160 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
11170 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
11180 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
11190 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
111a0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
111b0 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71   Mem m, v;..  sq
111c0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
111d0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
111e0 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
111f0 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey<=0 ){.    ret
11200 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11210 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d  PT_BKPT;.  }.  m
11220 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e  .flags = 0;.  m.
11230 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c  db = 0;.  m.zMal
11240 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  loc = 0;.  rc = 
11250 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
11260 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
11270 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d   nCellKey, 1, &m
11280 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
11290 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
112a0 7d 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  }.  (void)getVar
112b0 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
112c0 73 7a 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29  szHdr);.  (void)
112d0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
112e0 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20  )&m.z[szHdr-1], 
112f0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65  typeRowid);.  le
11300 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
11310 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
11320 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  n(typeRowid);.  
11330 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11340 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
11350 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
11360 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
11370 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
11380 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
11390 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
113a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
113b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
113c0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
113d0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
113e0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
113f0 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a  oint to against.
11400 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
11410 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65  g in pKey (of le
11420 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69  ngth nKey).  Wri
11430 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
11440 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
11450 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
11460 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
11470 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
11480 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
11490 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
114a0 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Key.  Return SQL
114b0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
114c0 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73  s..**.** pKey is
114d0 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
114e0 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
114f0 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
11500 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
11510 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
11520 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
11530 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
11540 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
11550 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
11560 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74   as well..*/.int
11570 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
11580 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72  eyCompare(.  Cur
11590 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
115a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
115b0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
115c0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
115d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
115e0 55 6e 70 61 63 6b 65 64 2c 0a 20 20 69 6e 74 20  Unpacked,.  int 
115f0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nKey, const u8 *
11600 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b  pKey,   /* The k
11610 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ey to compare */
11620 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11640 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
11650 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
11660 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
11670 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
11680 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
11690 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
116a0 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e  ursor;.  int len
116b0 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  Rowid;.  Mem m;.
116c0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
116d0 20 2a 70 52 65 63 3b 0a 20 20 63 68 61 72 20 7a   *pRec;.  char z
116e0 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 73  Space[200];..  s
116f0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
11700 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
11710 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
11720 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72  Key<=0 ){.    *r
11730 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
11740 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11750 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20  }.  m.db = 0;.  
11760 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d  m.flags = 0;.  m
11770 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  .zMalloc = 0;.  
11780 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
11790 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
117a0 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
117b0 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  , nCellKey, 1, &
117c0 6d 29 29 0a 20 20 20 7c 7c 20 28 72 63 20 3d 20  m)).   || (rc = 
117d0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
117e0 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 2c  widLen((u8*)m.z,
117f0 20 6d 2e 6e 2c 20 26 6c 65 6e 52 6f 77 69 64 29   m.n, &lenRowid)
11800 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
11810 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
11820 21 70 55 6e 70 61 63 6b 65 64 20 29 7b 0a 20 20  !pUnpacked ){.  
11830 20 20 70 52 65 63 20 3d 20 73 71 6c 69 74 65 33    pRec = sqlite3
11840 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
11850 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e  (pC->pKeyInfo, n
11860 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 20 20 20 20 20 20 20 20 7a 53 70 61 63             zSpac
11890 65 2c 20 73 69 7a 65 6f 66 28 7a 53 70 61 63 65  e, sizeof(zSpace
118a0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
118b0 20 70 52 65 63 20 3d 20 70 55 6e 70 61 63 6b 65   pRec = pUnpacke
118c0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65  d;.  }.  if( pRe
118d0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c==0 ){.    retu
118e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
118f0 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71  .  }.  *res = sq
11900 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
11910 6f 6d 70 61 72 65 28 6d 2e 6e 2d 6c 65 6e 52 6f  ompare(m.n-lenRo
11920 77 69 64 2c 20 6d 2e 7a 2c 20 70 52 65 63 29 3b  wid, m.z, pRec);
11930 0a 20 20 69 66 28 20 21 70 55 6e 70 61 63 6b 65  .  if( !pUnpacke
11940 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
11950 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
11960 65 64 52 65 63 6f 72 64 28 70 52 65 63 29 3b 0a  edRecord(pRec);.
11970 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
11980 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
11990 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
119a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
119b0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
119c0 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
119d0 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
119e0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
119f0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
11a00 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
11a10 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
11a20 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
11a30 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
11a40 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
11a50 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
11a60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11a70 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
11a80 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
11a90 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
11aa0 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
11ab0 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
11ac0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
11ad0 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
11ae0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
11af0 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
11b00 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
11b10 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
11b20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11b30 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
11b40 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
11b50 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
11b60 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
11b70 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
11b80 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
11b90 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
11ba0 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
11bb0 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
11bc0 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
11bd0 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
11be0 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
11bf0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
11c00 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
11c10 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
11c20 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
11c30 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
11c40 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
11c50 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
11c60 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
11c70 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
11c80 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
11c90 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
11ca0 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
11cb0 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
11cc0 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
11cd0 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
11ce0 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
11cf0 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
11d00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11d10 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
11d20 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
11d30 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
11d40 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
11d50 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
11d60 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
11d70 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
11d80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11d90 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
11da0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
11db0 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
11dc0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
11dd0 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
11de0 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a              rn v->db;.}.