/ Hex Artifact Content
Login

Artifact 45a53a4459c01db4e6befc977952346bfef405c3:


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 39 20 32  eaux.c,v 1.409 2
02c0: 30 30 38 2f 30 38 2f 32 30 20 32 32 3a 30 36 3a  008/08/20 22:06:
02d0: 34 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  48 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: 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
c8e0: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
c8f0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
c900: 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
c910: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
c920: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
c930: 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
c940: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
c950: 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
c960: 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
c970: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
c980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c990: 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
c9a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
c9b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
c9c0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
c9d0: 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
c9e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
c9f0: 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
ca00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
ca10: 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
ca20: 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
ca30: 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
ca40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
ca50: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
ca60: 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65  C_INIT ){.    re
ca70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
ca80: 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  SE;.  }.  sqlite
ca90: 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
caa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cab0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
cac0: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
cad0: 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
cae0: 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
caf0: 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
cb00: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
cb10: 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
cb20: 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
cb30: 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
cb40: 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
cb50: 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
cb60: 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
cb70: 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
cb80: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
cb90: 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
cba0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
cbb0: 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
cbc0: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
cbd0: 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
cbe0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
cbf0: 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
cc00: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
cc10: 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
cc20: 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
cc30: 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
cc40: 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
cc50: 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41  k&(1<<i))) && pA
cc60: 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20  ux->pAux ){.    
cc70: 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
cc80: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
cc90: 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
cca0: 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
ccb0: 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41  }.      pAux->pA
ccc0: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
ccd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
cce0: 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
ccf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cd00: 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
cd10: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
cd20: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
cd30: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
cd40: 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
cd50: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
cd60: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
cd70: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
cd80: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
cd90: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
cda0: 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
cdb0: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
cdc0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
cdd0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
cde0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
cdf0: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
ce00: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
ce10: 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f   Op *pOp = p->aO
ce20: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
ce30: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70  i<p->nOp; i++, p
ce40: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
ce50: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
ce60: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
ce70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ce80: 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74  EBUG.      sqlit
ce90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
cea0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e  ->zComment);.#en
ceb0: 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  dif     .    }. 
cec0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ced0: 28 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a 20 20  (db, p->aOp);.  
cee0: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
cef0: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
cf00: 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  nVar);.  sqlite3
cf10: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
cf20: 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e  abel);.  if( p->
cf30: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  aMem ){.    sqli
cf40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 26 70  te3DbFree(db, &p
cf50: 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20 7d 0a  ->aMem[1]);.  }.
cf60: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
cf70: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
cf80: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
cf90: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
cfa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
cfb0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
cfc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
cfd0: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61  ->zSql);.  p->ma
cfe0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
cff0: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33  _DEAD;.  sqlite3
d000: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
d010: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ../*.** If a Mov
d020: 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
d030: 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
d040: 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
d050: 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
d060: 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72  veTo now.  Retur
d070: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
d080: 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69    If no MoveTo i
d090: 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a  s pending, this.
d0a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  ** routine does 
d0b0: 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75  nothing and retu
d0c0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
d0d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
d0e0: 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75  eCursorMoveto(Cu
d0f0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
d100: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
d110: 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
d120: 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
d130: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74  ITE_TEST.    ext
d140: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
d150: 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
d160: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
d170: 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
d180: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d190: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
d1a0: 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
d1b0: 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
d1c0: 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
d1d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d1e0: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74   rc;.    p->last
d1f0: 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74  Rowid = keyToInt
d200: 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  (p->movetoTarget
d210: 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  );.    p->rowidI
d220: 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b  sValid = res==0;
d230: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
d240: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d250: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d  ite3BtreeNext(p-
d260: 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
d270: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
d280: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d2a0: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
d2b0: 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
d2c0: 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
d2d0: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
d2e0: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
d2f0: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
d300: 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
d310: 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  p->pCursor ){.  
d320: 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a    int hasMoved;.
d330: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
d340: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
d350: 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
d360: 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a  or, &hasMoved);.
d370: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d380: 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
d390: 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  hasMoved ){.    
d3a0: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
d3b0: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
d3c0: 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77        p->nullRow
d3d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
d3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d3f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
d400: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
d410: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
d420: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d430: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
d440: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
d450: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
d460: 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
d470: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d480: 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
d490: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
d4a0: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
d4b0: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
d4c0: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
d4d0: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
d4e0: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
d4f0: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
d500: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
d510: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
d520: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
d530: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
d540: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
d550: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
d560: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
d570: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
d580: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
d590: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
d5a0: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
d5b0: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
d5c0: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
d5d0: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
d5e0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
d5f0: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
d600: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
d610: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
d620: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
d630: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
d640: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
d650: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
d660: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
d670: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
d680: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
d690: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
d6a0: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
d6b0: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
d6c0: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
d6d0: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
d6e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
d6f0: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
d700: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
d710: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
d720: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
d730: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
d740: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
d750: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
d780: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d790: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
d7c0: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
d7f0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
d800: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
d810: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
d820: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
d830: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
d860: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d870: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
d890: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
d8a0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
d8b0: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
d8c0: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
d8d0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
d8e0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
d910: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
d920: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
d930: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
d940: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
d950: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
d980: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
d990: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
d9c0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
d9d0: 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
da00: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
da10: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
da20: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
da30: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
da40: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
da50: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
da60: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
da70: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
da80: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
da90: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
daa0: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
dab0: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
dac0: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
dad0: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
dae0: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
daf0: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
db00: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
db10: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
db20: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
db30: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
db40: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
db50: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
db60: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
db70: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
db80: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
db90: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
dba0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
dbb0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
dbc0: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
dbd0: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
dbe0: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
dbf0: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
dc00: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
dc10: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
dc20: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
dc30: 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
dc40: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
dc50: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
dc60: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
dc70: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
dc80: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
dc90: 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20  rn 8+i;.    }.  
dca0: 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a    u = i<0 ? -i :
dcb0: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
dcc0: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
dcd0: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
dce0: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
dcf0: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
dd00: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
dd10: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
dd20: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
dd30: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
dd40: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
dd50: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
dd60: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
dd70: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
dd80: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
dd90: 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53  rt( flags&(MEM_S
dda0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
ddb0: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
ddc0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
ddd0: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
dde0: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d  = pMem->u.i;.  }
ddf0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
de00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
de10: 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
de20: 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
de30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
de40: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
de50: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
de60: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
de70: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
de80: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
de90: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
dea0: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
deb0: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
dec0: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
ded0: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
dee0: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
def0: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
df00: 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
df10: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
df20: 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
df30: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
df40: 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
df50: 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
df60: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
df70: 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
df80: 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
df90: 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
dfa0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
dfb0: 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
dfc0: 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
dfd0: 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
dfe0: 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
dff0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
e000: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
e010: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
e020: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
e030: 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
e040: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
e050: 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
e060: 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
e070: 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
e080: 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
e090: 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
e0a0: 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
e0b0: 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
e0c0: 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
e0d0: 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
e0e0: 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
e0f0: 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
e100: 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
e110: 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
e120: 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
e130: 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
e140: 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
e150: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e160: 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
e170: 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
e180: 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
e190: 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
e1a0: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
e1b0: 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
e1c0: 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
e1d0: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
e1e0: 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
e1f0: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
e200: 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
e210: 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
e220: 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
e230: 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
e240: 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
e250: 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
e260: 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
e270: 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
e280: 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
e290: 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
e2a0: 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
e2b0: 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
e2c0: 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
e2d0: 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
e2e0: 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
e2f0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
e300: 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
e310: 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
e320: 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
e330: 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
e340: 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
e350: 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
e360: 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
e370: 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
e380: 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
e390: 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
e3a0: 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
e3b0: 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
e3c0: 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
e3d0: 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
e3e0: 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
e3f0: 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
e400: 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
e410: 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
e420: 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
e430: 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
e440: 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
e450: 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
e460: 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
e470: 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
e480: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
e490: 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
e4a0: 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
e4b0: 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
e4c0: 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
e4d0: 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
e4e0: 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
e4f0: 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
e500: 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
e510: 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
e520: 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
e530: 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
e540: 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
e550: 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
e560: 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
e570: 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
e580: 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
e590: 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
e5a0: 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
e5b0: 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
e5c0: 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
e5d0: 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
e5e0: 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
e5f0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
e600: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
e610: 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
e620: 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
e630: 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
e640: 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
e650: 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
e660: 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
e670: 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
e680: 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
e690: 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
e6a0: 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
e6b0: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
e6c0: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
e6d0: 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
e6e0: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
e6f0: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
e700: 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
e710: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
e720: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
e730: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
e740: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
e750: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
e760: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
e770: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
e780: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
e790: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
e7a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
e7b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
e7c0: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
e7d0: 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
e7e0: 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
e7f0: 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
e800: 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
e810: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
e820: 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
e830: 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
e840: 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
e850: 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
e860: 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
e870: 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
e880: 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
e890: 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
e8a0: 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
e8b0: 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
e8c0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
e8d0: 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
e8e0: 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
e8f0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
e900: 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
e910: 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
e920: 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
e930: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
e940: 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
e950: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
e960: 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
e970: 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
e980: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
e990: 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
e9a0: 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
e9b0: 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
e9c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
e9d0: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
e9e0: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
e9f0: 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
ea00: 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
ea10: 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
ea20: 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
ea30: 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
ea40: 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
ea50: 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
ea60: 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
ea70: 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  []..*/ .int sqli
ea80: 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
ea90: 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
eaa0: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
eab0: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
eac0: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
ead0: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
eae0: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
eaf0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
eb00: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
eb10: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
eb20: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
eb30: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
eb40: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
eb50: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
eb60: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
eb70: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
eb80: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
eb90: 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
eba0: 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
ebb0: 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
ebc0: 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
ebd0: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
ebe0: 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
ebf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ec00: 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
ec10: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
ec20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
ec30: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
ec40: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
ec50: 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20  sert( len<=nBuf 
ec60: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
ec70: 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
ec80: 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20  ] = (v&0xFF);.  
ec90: 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
eca0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
ecb0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
ecc0: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
ecd0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
ece0: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
ecf0: 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
ed00: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
ed10: 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
ed20: 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  i:0).           
ed30: 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65    == sqlite3Vdbe
ed40: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
ed50: 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
ed60: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
ed70: 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
ed80: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
ed90: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
eda0: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
edb0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
edc0: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
edd0: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
ede0: 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28  ->u.i;.      if(
edf0: 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20   len>nBuf ){.   
ee00: 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b       len = nBuf;
ee10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
ee20: 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
ee30: 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
ee40: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
ee50: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
ee60: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
ee70: 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
ee80: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
ee90: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
eea0: 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
eeb0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
eec0: 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
eed0: 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
eee0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
eef0: 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
ef00: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
ef10: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
ef20: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
ef30: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
ef40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
ef50: 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
ef60: 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
ef70: 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
ef80: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
ef90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
efa0: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
efb0: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
efc0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
eff0: 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
f000: 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
f010: 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
f020: 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
f030: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
f040: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
f050: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
f060: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
f070: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
f080: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
f090: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
f0a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
f0b0: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
f0c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f0d0: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
f0e0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
f0f0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
f100: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
f110: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
f120: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f130: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f140: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
f150: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
f160: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f170: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
f180: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
f190: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
f1a0: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
f1b0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f1c0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f1d0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
f1e0: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
f1f0: 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
f200: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
f210: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
f220: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f230: 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
f240: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
f250: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f260: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
f270: 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
f280: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
f290: 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
f2a0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
f2b0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
f2c0: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
f2d0: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
f2e0: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
f2f0: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f300: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
f320: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
f330: 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
f340: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f350: 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
f360: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
f370: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
f380: 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
f390: 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
f3a0: 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
f3b0: 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
f3c0: 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
f3d0: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
f3e0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
f3f0: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
f400: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f410: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f420: 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
f430: 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
f440: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f450: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
f460: 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
f470: 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
f480: 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
f490: 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
f4a0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
f4b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f4c0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
f4d0: 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
f4e0: 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
f4f0: 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
f500: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
f510: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
f520: 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
f530: 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
f540: 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
f550: 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
f560: 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
f570: 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
f580: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
f590: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
f5a0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
f5b0: 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
f5c0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f5d0: 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
f5e0: 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
f5f0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
f600: 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
f610: 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
f620: 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
f630: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
f640: 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
f650: 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
f660: 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
f670: 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
f680: 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
f690: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
f6a0: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
f6b0: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
f6c0: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
f6d0: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
f6e0: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
f6f0: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
f700: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
f710: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
f720: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
f730: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
f740: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
f750: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
f760: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
f770: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f780: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
f790: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
f7a0: 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
f7b0: 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
f7c0: 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
f7d0: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
f7e0: 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
f7f0: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
f800: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
f810: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
f820: 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
f830: 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20  3IsNaN(pMem->r) 
f840: 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
f850: 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
f860: 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
f870: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
f880: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
f890: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
f8a0: 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
f8b0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
f8c0: 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
f8d0: 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
f8e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
f8f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
f900: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
f910: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lt: {.      int 
f920: 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  len = (serial_ty
f930: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
f940: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
f950: 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
f960: 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
f970: 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
f980: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
f990: 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a  al_type&0x01 ){.
f9a0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
f9b0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20  ags = MEM_Str | 
f9c0: 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
f9d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f9e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f9f0: 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68  M_Blob | MEM_Eph
fa00: 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
fa10: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
fa20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
fa30: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69   0;.}.../*.** Gi
fa40: 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
fa50: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
fa60: 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
fa70: 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72  , parse the.** r
fa80: 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70  ecord into a Unp
fa90: 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
faa0: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61  cture.  Return a
fab0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
fac0: 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  hat structure..*
fad0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
fae0: 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20   function might 
faf0: 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20  provide szSpace 
fb00: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
fb10: 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61  ** space at pSpa
fb20: 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20  ce.  This space 
fb30: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68  can be used to h
fb40: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
fb50: 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65  .** VDbeParsedRe
fb60: 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
fb70: 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e  f it is large en
fb80: 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a  ough.  If it is.
fb90: 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67  ** not big enoug
fba0: 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61  h, space is obta
fbb0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
fbc0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3_malloc()..**.*
fbd0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73  * The returned s
fbe0: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
fbf0: 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63  be closed by a c
fc00: 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  all to.** sqlite
fc10: 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
fc20: 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20  kedRecord()..*/ 
fc30: 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
fc40: 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  *sqlite3VdbeReco
fc50: 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
fc60: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
fc70: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
fc80: 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
fc90: 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
fca0: 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
fcb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
fcc0: 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
fcd0: 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
fce0: 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
fcf0: 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
fd00: 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ord */.  Unpacke
fd10: 64 52 65 63 6f 72 64 20 2a 70 53 70 61 63 65 2c  dRecord *pSpace,
fd20: 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62  /* Space availab
fd30: 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c  le to hold resul
fd40: 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ting object */. 
fd50: 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
fd60: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
fd70: 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
fd80: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
fd90: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
fda0: 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
fdb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
fdc0: 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
fdd0: 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74  Record *p;.  int
fde0: 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 64   nByte;.  int id
fdf0: 78 2c 20 64 3b 0a 20 20 75 31 36 20 75 3b 20 20  x, d;.  u16 u;  
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe10: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
fe20: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
fe30: 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
fe40: 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  Mem;.  .  assert
fe50: 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69  ( sizeof(Mem)>si
fe60: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42  zeof(*p) );.  nB
fe70: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d  yte = sizeof(Mem
fe80: 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
fe90: 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42  eld+2);.  if( nB
fea0: 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
feb0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
fec0: 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
fed0: 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
fee0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
fef0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
ff00: 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
ff10: 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50  _NEED_FREE | UNP
ff20: 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
ff30: 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OY;.  }else{.   
ff40: 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20   p = pSpace;.   
ff50: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41   p->flags = UNPA
ff60: 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
ff70: 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79  Y;.  }.  p->pKey
ff80: 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
ff90: 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
ffa0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
ffb0: 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  + 1;.  p->aMem =
ffc0: 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29   pMem = &((Mem*)
ffd0: 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67  p)[1];.  idx = g
ffe0: 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
fff0: 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
10000 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
10010 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
10020 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64  r && u<p->nField
10030 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
10040 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
10050 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
10060 28 20 61 4b 65 79 2b 69 64 78 2c 20 73 65 72 69  ( aKey+idx, seri
10070 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66  al_type);.    if
10080 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c  ( d>=nKey && sql
10090 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
100a0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
100b0 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e)>0 ) break;.  
100c0 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
100d0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
100e0 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
100f0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d  Info->db;.    pM
10100 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em->flags = 0;. 
10110 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
10120 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
10130 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10140 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
10150 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
10160 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
10170 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73    u++;.  }.  ass
10180 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
10190 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
101a0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
101b0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
101c0 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )p;.}../*.** Thi
101d0 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f  s routine destro
101e0 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63  ys a UnpackedRec
101f0 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  ord object.*/.vo
10200 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
10210 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
10220 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  rd(UnpackedRecor
10230 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  d *p){.  if( p )
10240 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61  {.    if( p->fla
10250 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
10260 45 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20  ED_DESTROY ){.  
10270 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
10280 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20   Mem *pMem;.    
10290 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d    for(i=0, pMem=
102a0 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46  p->aMem; i<p->nF
102b0 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b  ield; i++, pMem+
102c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
102d0 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  pMem->zMalloc ){
102e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
102f0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
10300 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  (pMem);.        
10310 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10320 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
10330 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   & UNPACKED_NEED
10340 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20 73  _FREE ){.      s
10350 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
10360 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29  pKeyInfo->db, p)
10370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10380 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
10390 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
103a0 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
103b0 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
103c0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
103d0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
103e0 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
103f0 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
10400 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
10410 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
10420 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
10430 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
10440 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
10450 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
10460 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
10470 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
10480 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20  * created by th 
10490 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
104a0 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
104b0 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
104c0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
104d0 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
104e0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
104f0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
10500 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
10510 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
10520 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
10530 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
10540 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
10550 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68  .** The key with
10560 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73   fewer fields is
10570 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65   usually compare
10580 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
10590 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20  .** longer key. 
105a0 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20   However if the 
105b0 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
105c0 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32   flags in pPKey2
105d0 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74   is set.** and t
105e0 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
105f0 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68  es are equal, th
10600 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  en key1 is less 
10610 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72  than key2..** Or
10620 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
10630 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c  _MATCH_PREFIX fl
10640 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
10650 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a  e prefixes are.*
10660 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68  * equal, then th
10670 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69  e keys are consi
10680 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
10690 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72  l and.** the par
106a0 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f  ts beyond the co
106b0 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20  mmon prefix are 
106c0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
106d0 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
106e0 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67  GNORE_ROWID flag
106f0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
10700 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a  e last byte of.*
10710 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  * the header of 
10720 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64  pKey1 is ignored
10730 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
10740 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a   that pKey1 is.*
10750 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20  * an index key, 
10760 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69  and thus ends wi
10770 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65  th a rowid value
10780 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65  .  The last byte
10790 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65  .** of the heade
107a0 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65  r will therefore
107b0 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74   be the serial t
107c0 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
107d0 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32  :.** one of 1, 2
107e0 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c  , 3, 4, 5, 6, 8,
107f0 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65   or 9 - the inte
10800 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  ger serial types
10810 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20  ..** The serial 
10820 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61  type of the fina
10830 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77  l rowid will alw
10840 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ays be a single 
10850 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f  byte..** By igno
10860 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62  ring this last b
10870 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
10880 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20  r, we force the 
10890 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f  comparison.** to
108a0 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69   ignore the rowi
108b0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
108c0 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  key1..*/.int sql
108d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
108e0 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
108f0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
10900 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
10910 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
10920 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
10930 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
10940 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ey */.){.  u32 d
10950 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
10960 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
10970 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
10980 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
10990 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
109a0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
109b0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
109c0 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
109d0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
109e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
109f0 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
10a00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
10a10 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  0;.  int nField;
10a20 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
10a30 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
10a40 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
10a50 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10a60 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65  ar *)pKey1;.  Ke
10a70 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
10a80 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
10a90 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
10aa0 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d  2->pKeyInfo;.  m
10ab0 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
10ac0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
10ad0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
10ae0 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20  b;.  mem1.flags 
10af0 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c  = 0;.  mem1.zMal
10b00 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64  loc = 0;.  .  id
10b10 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
10b20 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
10b30 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
10b40 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
10b50 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
10b60 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20  GNORE_ROWID ){. 
10b70 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d     szHdr1--;.  }
10b80 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
10b90 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
10ba0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
10bb0 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
10bc0 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
10bd0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
10be0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
10bf0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
10c00 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
10c10 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
10c20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
10c30 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
10c40 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
10c50 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
10c60 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
10c70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
10c80 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
10c90 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
10ca0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
10cb0 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
10cc0 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
10cd0 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
10ce0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
10cf0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
10d00 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
10d10 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
10d20 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
10d30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10d40 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
10d50 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
10d60 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
10d90 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
10da0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
10db0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  !=0 ){.      bre
10dc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  ak;.    }.    i+
10dd0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d  +;.  }.  if( mem
10de0 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  1.zMalloc ) sqli
10df0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
10e00 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69 66 28  e(&mem1);..  if(
10e10 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a   rc==0 ){.    /*
10e20 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
10e30 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
10e40 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
10e50 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 20  f fields and.   
10e60 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
10e70 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
10e80 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
10e90 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
10ea0 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20 66  INCRKEY.    ** f
10eb0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
10ec0 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62   break the tie b
10ed0 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20  y treating key2 
10ee0 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20 2a  as larger..    *
10ef0 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44  * If the UPACKED
10f00 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c  _PREFIX_MATCH fl
10f10 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
10f20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e  keys with common
10f30 20 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a 2a   prefixes.    **
10f40 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
10f50 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74  to be equal.  Ot
10f60 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e  herwise, the lon
10f70 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a  ger key is the .
10f80 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20      ** larger.  
10f90 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
10fa0 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61  he pPKey2 will a
10fb0 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e  lways be the lon
10fc0 67 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ger.    ** if th
10fd0 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65  ere is a differe
10fe0 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nce..    */.    
10ff0 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
11000 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  s & UNPACKED_INC
11010 52 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72 63  RKEY ){.      rc
11020 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
11030 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
11040 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
11050 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
11060 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
11070 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  =0 */.    }else 
11080 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
11090 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
110a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
110b0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
110c0 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65  rtOrder && i<pKe
110d0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20  yInfo->nField.  
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
110f0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
11100 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72  rder[i] ){.    r
11110 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20  c = -rc;.  }..  
11120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a  return rc;.}. ..
11130 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
11140 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
11150 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
11160 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
11170 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
11180 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
11190 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
111a0 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
111b0 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
111c0 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
111d0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
111e0 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
111f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
11200 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
11210 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
11220 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
11230 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
11240 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
11250 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
11260 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
11270 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
11280 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
11290 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
112a0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
112b0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
112c0 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
112d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
112e0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
112f0 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74  m m, v;..  sqlit
11300 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
11310 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
11320 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
11330 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
11340 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11350 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 2e 66 6c  BKPT;.  }.  m.fl
11360 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62 20  ags = 0;.  m.db 
11370 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63  = 0;.  m.zMalloc
11380 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
11390 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
113a0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 6e 43  tree(pCur, 0, nC
113b0 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
113c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
113d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
113e0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
113f0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
11400 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67 65 74  dr);.  (void)get
11410 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
11420 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
11430 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f  eRowid);.  lenRo
11440 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
11450 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
11460 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  ypeRowid);.  sql
11470 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
11480 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
11490 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
114a0 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
114b0 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
114c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
114d0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
114e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
114f0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
11500 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
11510 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
11520 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
11530 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  t to against.** 
11540 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
11550 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74  n pKey (of lengt
11560 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20  h nKey).  Write 
11570 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
11580 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
11590 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
115a0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
115b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
115c0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
115d0 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79  reater than pKey
115e0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
115f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
11600 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69  **.** pKey is ei
11610 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
11620 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
11630 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
11640 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
11650 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
11660 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
11670 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
11680 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
11690 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
116a0 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
116b0 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
116c0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
116d0 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
116e0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
116f0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
11700 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
11710 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  key..**.** pUnpa
11720 63 6b 65 64 20 6d 61 79 20 62 65 20 61 6e 20 75  cked may be an u
11730 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
11740 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 49  of pKey,nKey.  I
11750 66 20 70 55 6e 70 61 63 6b 65 64 20 69 73 0a 2a  f pUnpacked is.*
11760 2a 20 73 75 70 70 6c 69 65 64 20 69 74 20 69 73  * supplied it is
11770 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
11780 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 0a 2a 2f 0a  f pKey,nKey..*/.
11790 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
117a0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
117b0 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
117c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
117d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
117e0 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
117f0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
11800 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a   *pUnpacked,  /*
11810 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
11820 6e 20 6f 66 20 70 4b 65 79 20 61 6e 64 20 6e 4b  n of pKey and nK
11830 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  ey */.  int *res
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
11860 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
11870 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
11880 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
11890 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
118a0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
118b0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
118c0 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  m m;..  sqlite3B
118d0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
118e0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
118f0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
11900 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
11910 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11920 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64  TE_OK;.  }.  m.d
11930 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73  b = 0;.  m.flags
11940 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f   = 0;.  m.zMallo
11950 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  c = 0;.  rc = sq
11960 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
11970 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
11980 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
11990 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
119a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
119b0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
119c0 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
119d0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
119e0 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a  ORE_ROWID );.  *
119f0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
11a00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
11a10 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
11a20 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
11a30 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
11a40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11a50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
11a60 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
11a70 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
11a80 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
11a90 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
11aa0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
11ab0 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
11ac0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
11ad0 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
11ae0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
11af0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
11b00 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
11b10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11b20 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
11b30 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
11b40 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
11b50 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
11b60 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
11b70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
11b80 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
11b90 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
11ba0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
11bb0 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
11bc0 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
11bd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11be0 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
11bf0 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
11c00 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
11c10 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
11c20 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
11c30 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
11c40 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
11c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
11c60 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
11c70 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
11c80 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
11c90 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
11ca0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
11cb0 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
11cc0 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
11cd0 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
11ce0 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
11cf0 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
11d00 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
11d10 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
11d20 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
11d30 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
11d40 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
11d50 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
11d60 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
11d70 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
11d80 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
11d90 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
11da0 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
11db0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11dc0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
11dd0 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
11de0 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
11df0 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
11e00 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
11e10 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
11e20 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
11e30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11e40 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
11e50 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
11e60 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
11e70 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
11e80 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
11e90 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a           urn v->db;.}.