/ Hex Artifact Content
Login

Artifact 21126e0d319e19125f5e42fceafb17eafe58721c:


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 35 20 32  eaux.c,v 1.405 2
02c0: 30 30 38 2f 30 38 2f 30 32 20 30 33 3a 35 30 3a  008/08/02 03:50:
02d0: 33 39 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  39 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 28 70 2d 3e 70 43  treeMoveto(p->pC
d1a0: 75 72 73 6f 72 2c 20 30 2c 20 30 2c 20 70 2d 3e  ursor, 0, 0, p->
d1b0: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
d1c0: 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
d1d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d1e0: 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79      *p->pIncrKey
d1f0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73   = 0;.    p->las
d200: 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e  tRowid = keyToIn
d210: 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  t(p->movetoTarge
d220: 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  t);.    p->rowid
d230: 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30  IsValid = res==0
d240: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
d250: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d260: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
d270: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
d280: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d290: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d2a0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
d2b0: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
d2c0: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
d2d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
d2e0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
d2f0: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
d300: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
d310: 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ALE;.  }else if(
d320: 20 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20   p->pCursor ){. 
d330: 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b     int hasMoved;
d340: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
d350: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
d360: 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
d370: 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b  sor, &hasMoved);
d380: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
d390: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
d3a0: 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20   hasMoved ){.   
d3b0: 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
d3c0: 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
d3d0: 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f  .      p->nullRo
d3e0: 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 1;.    }.  }
d3f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d400: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
d410: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
d420: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
d430: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d440: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
d450: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
d460: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d470: 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
d480: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d490: 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
d4a0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
d4b0: 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
d4c0: 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
d4d0: 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
d4e0: 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
d4f0: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
d500: 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
d510: 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
d520: 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
d530: 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
d540: 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
d550: 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
d560: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
d570: 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
d580: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
d590: 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
d5a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
d5b0: 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
d5c0: 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
d5d0: 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
d5e0: 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
d5f0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
d600: 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
d610: 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
d620: 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
d630: 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
d640: 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
d650: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d660: 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
d670: 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
d680: 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
d690: 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
d6a0: 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
d6b0: 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
d6c0: 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
d6d0: 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
d6e0: 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
d6f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
d700: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
d710: 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
d720: 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
d730: 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
d740: 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
d750: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
d760: 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
d780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
d790: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
d7a0: 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
d7d0: 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
d800: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
d810: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
d820: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
d830: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
d840: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
d870: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
d880: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
d8b0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
d8c0: 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
d8d0: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
d8e0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
d8f0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
d920: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
d930: 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
d950: 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
d960: 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d990: 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
d9a0: 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
d9d0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
d9e0: 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
da10: 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
da20: 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
da30: 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
da40: 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
da50: 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
da60: 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
da70: 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
da80: 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
da90: 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
daa0: 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
dab0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
dac0: 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
dad0: 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
dae0: 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
daf0: 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
db00: 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
db10: 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
db20: 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
db30: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
db40: 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
db50: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
db60: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
db70: 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69  ile_format){.  i
db80: 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
db90: 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b  >flags;.  int n;
dba0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
dbb0: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
dbc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
dbd0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
dbe0: 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
dbf0: 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
dc00: 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
dc10: 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
dc20: 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
dc30: 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
dc40: 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
dc50: 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
dc60: 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
dc70: 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
dc80: 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
dc90: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
dca0: 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20  urn 8+i;.    }. 
dcb0: 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20     u = i<0 ? -i 
dcc0: 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  : i;.    if( u<=
dcd0: 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
dce0: 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
dcf0: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
dd00: 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
dd10: 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
dd20: 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
dd30: 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
dd40: 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
dd50: 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
dd60: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
dd70: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
dd80: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
dd90: 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
dda0: 65 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f  ert( flags&(MEM_
ddb0: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
ddc0: 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a  .  n = pMem->n;.
ddd0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
dde0: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
ddf0: 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20  += pMem->u.i;.  
de00: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
de10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
de20: 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
de30: 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
de40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
de50: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
de60: 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
de70: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
de80: 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
de90: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
dea0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
deb0: 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
dec0: 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
ded0: 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
dee0: 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
def0: 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
df00: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
df10: 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
df20: 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
df30: 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
df40: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
df50: 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
df60: 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
df70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
df80: 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
df90: 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
dfa0: 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
dfb0: 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
dfc0: 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
dfd0: 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
dfe0: 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
dff0: 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
e000: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
e010: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
e020: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
e030: 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
e040: 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
e050: 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
e060: 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
e070: 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
e080: 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
e090: 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
e0a0: 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
e0b0: 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
e0c0: 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
e0d0: 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
e0e0: 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
e0f0: 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
e100: 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
e110: 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
e120: 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
e130: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
e140: 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
e150: 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
e160: 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
e170: 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
e180: 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
e190: 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
e1a0: 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
e1b0: 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
e1c0: 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
e1d0: 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
e1e0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
e1f0: 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
e200: 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
e210: 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
e220: 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
e230: 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
e240: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
e250: 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
e260: 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
e270: 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
e280: 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
e290: 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
e2a0: 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
e2b0: 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
e2c0: 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
e2d0: 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
e2e0: 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
e2f0: 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
e300: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
e310: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
e320: 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
e330: 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
e340: 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
e350: 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
e360: 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
e370: 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
e380: 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
e390: 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
e3a0: 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
e3b0: 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
e3c0: 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
e3d0: 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
e3e0: 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
e3f0: 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
e400: 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
e410: 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
e420: 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
e430: 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
e440: 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
e450: 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
e460: 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
e470: 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
e480: 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
e490: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
e4a0: 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
e4b0: 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
e4c0: 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
e4d0: 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
e4e0: 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
e4f0: 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
e500: 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
e510: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
e520: 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
e530: 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
e540: 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
e550: 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
e560: 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
e570: 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
e580: 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
e590: 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
e5a0: 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
e5b0: 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
e5c0: 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
e5d0: 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
e5e0: 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
e5f0: 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
e600: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
e610: 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
e620: 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
e630: 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
e640: 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
e650: 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
e660: 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
e670: 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
e680: 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
e690: 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
e6a0: 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
e6b0: 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
e6c0: 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
e6d0: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
e6e0: 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
e6f0: 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
e700: 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
e710: 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
e720: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
e730: 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
e740: 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
e750: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
e760: 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
e770: 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
e780: 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
e790: 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
e7a0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
e7b0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
e7c0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
e7d0: 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
e7e0: 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
e7f0: 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
e800: 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
e810: 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
e820: 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
e830: 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
e840: 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
e850: 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
e860: 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
e870: 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
e880: 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
e890: 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
e8a0: 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
e8b0: 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
e8c0: 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
e8d0: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
e8e0: 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
e8f0: 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
e900: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
e910: 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
e920: 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
e930: 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
e940: 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
e950: 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
e960: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
e970: 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
e980: 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
e990: 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
e9a0: 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
e9b0: 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
e9c0: 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
e9d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
e9e0: 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
e9f0: 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
ea00: 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
ea10: 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
ea20: 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
ea30: 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
ea40: 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
ea50: 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
ea60: 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
ea70: 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
ea80: 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  f[]..*/ .int sql
ea90: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
eaa0: 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
eab0: 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
eac0: 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
ead0: 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
eae0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
eaf0: 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
eb00: 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
eb10: 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    int len;..  /*
eb20: 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
eb30: 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
eb40: 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
eb50: 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
eb60: 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74    u64 v;.    int
eb70: 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
eb80: 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
eb90: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
eba0: 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
ebb0: 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
ebc0: 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
ebd0: 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
ebe0: 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
ebf0: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
ec00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ec10: 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
ec20: 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
ec30: 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
ec40: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
ec50: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
ec60: 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66  ssert( len<=nBuf
ec70: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   );.    while( i
ec80: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b  -- ){.      buf[
ec90: 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20  i] = (v&0xFF);. 
eca0: 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
ecb0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
ecc0: 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
ecd0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
ece0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
ecf0: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
ed00: 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
ed10: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
ed20: 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
ed30: 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  .i:0).          
ed40: 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62     == sqlite3Vdb
ed50: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
ed60: 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
ed70: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
ed80: 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
ed90: 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
eda0: 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
edb0: 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
edc0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
edd0: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
ede0: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
edf0: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66  m->u.i;.      if
ee00: 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20  ( len>nBuf ){.  
ee10: 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66        len = nBuf
ee20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee30: 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
ee40: 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
ee50: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
ee60: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
ee70: 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
ee80: 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
ee90: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
eea0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
eeb0: 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
eec0: 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
eed0: 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
eee0: 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
eef0: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
ef00: 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
ef10: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
ef20: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
ef30: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
ef40: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
ef50: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
ef60: 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
ef70: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
ef80: 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
ef90: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
efa0: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
efb0: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
efc0: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
efd0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
f000: 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
f010: 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
f020: 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
f030: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
f040: 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
f050: 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
f060: 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
f070: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
f080: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
f090: 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
f0a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
f0b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f0c0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
f0d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f0e0: 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
f0f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
f100: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
f110: 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
f120: 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
f130: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f140: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
f150: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
f160: 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
f170: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
f180: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
f190: 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
f1a0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
f1b0: 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
f1c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f1d0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f1e0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
f1f0: 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
f200: 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
f210: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
f220: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
f230: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
f240: 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
f250: 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
f260: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f270: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
f280: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
f290: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
f2a0: 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
f2b0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
f2c0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
f2d0: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
f2e0: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
f2f0: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
f300: 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
f310: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
f320: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
f330: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f340: 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
f350: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
f360: 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
f370: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
f380: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
f390: 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
f3a0: 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
f3b0: 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
f3c0: 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
f3d0: 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
f3e0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
f3f0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
f400: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
f410: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f420: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
f430: 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
f440: 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
f450: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
f460: 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
f470: 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
f480: 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
f490: 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
f4a0: 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
f4b0: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
f4c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f4d0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
f4e0: 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
f4f0: 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
f500: 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
f510: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
f520: 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
f530: 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
f540: 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
f550: 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
f560: 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
f570: 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
f580: 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
f590: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
f5a0: 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
f5b0: 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
f5c0: 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
f5d0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f5e0: 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
f5f0: 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
f600: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
f610: 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
f620: 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
f630: 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
f640: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
f650: 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
f660: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
f670: 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
f680: 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
f690: 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
f6a0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
f6b0: 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
f6c0: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
f6d0: 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
f6e0: 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
f6f0: 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
f700: 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
f710: 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
f720: 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
f730: 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
f740: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
f750: 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
f760: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
f770: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
f780: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f790: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
f7a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
f7b0: 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
f7c0: 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
f7d0: 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
f7e0: 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
f7f0: 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
f800: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
f810: 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
f820: 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
f830: 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
f840: 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
f850: 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
f860: 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
f870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
f880: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
f890: 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
f8a0: 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
f8b0: 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
f8c0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
f8d0: 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
f8e0: 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
f8f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
f900: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
f910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
f920: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
f930: 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
f940: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
f950: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
f960: 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
f970: 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
f980: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
f990: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
f9a0: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
f9b0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
f9c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
f9d0: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
f9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f9f0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
fa00: 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
fa10: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
fa20: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
fa30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
fa40: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  n 0;.}.../*.** G
fa50: 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
fa60: 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
fa70: 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
fa80: 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20  ], parse the.** 
fa90: 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e  record into a Un
faa0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
fab0: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
fac0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
fad0: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a  that structure..
fae0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
faf0: 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74  g function might
fb00: 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65   provide szSpace
fb10: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
fb20: 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70  .** space at pSp
fb30: 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65  ace.  This space
fb40: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
fb50: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
fb60: 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52  d.** VDbeParsedR
fb70: 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
fb80: 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65  if it is large e
fb90: 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73  nough.  If it is
fba0: 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75  .** not big enou
fbb0: 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74  gh, space is obt
fbc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
fbd0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3_malloc()..**.
fbe0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
fbf0: 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64  structure should
fc00: 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20   be closed by a 
fc10: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
fc20: 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
fc30: 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f  ckedRecord()..*/
fc40: 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   .UnpackedRecord
fc50: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63   *sqlite3VdbeRec
fc60: 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
fc70: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
fc80: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
fc90: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
fca0: 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
fcb0: 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
fcc0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
fcd0: 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
fce0: 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
fcf0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
fd00: 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
fd10: 63 6f 72 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  cord */.  void *
fd20: 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
fd30: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
fd40: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65 73 75  ble to hold resu
fd50: 6c 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a  lting object */.
fd60: 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20    int szSpace   
fd70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fd80: 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
fd90: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  bytes */.){.  co
fda0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
fdb0: 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
fdc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
fdd0: 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65  )pKey;.  Unpacke
fde0: 64 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e  dRecord *p;.  in
fdf0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
fe00: 64 78 2c 20 64 3b 0a 20 20 75 31 36 20 75 3b 20  dx, d;.  u16 u; 
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
fe30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33   counter */.  u3
fe40: 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a  2 szHdr;.  Mem *
fe50: 70 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72  pMem;.  .  asser
fe60: 74 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73  t( sizeof(Mem)>s
fe70: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e  izeof(*p) );.  n
fe80: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65  Byte = sizeof(Me
fe90: 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
fea0: 69 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e  ield+2);.  if( n
feb0: 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a  Byte>szSpace ){.
fec0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
fed0: 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
fee0: 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
fef0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
ff00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d  return 0;.    p-
ff10: 3e 6e 65 65 64 46 72 65 65 20 3d 20 31 3b 0a 20  >needFree = 1;. 
ff20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
ff30: 70 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 6e  pSpace;.    p->n
ff40: 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
ff50: 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
ff60: 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
ff70: 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
ff80: 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
ff90: 20 70 2d 3e 6e 65 65 64 44 65 73 74 72 6f 79 20   p->needDestroy 
ffa0: 3d 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  = 1;.  p->aMem =
ffb0: 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29   pMem = &((Mem*)
ffc0: 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67  p)[1];.  idx = g
ffd0: 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
ffe0: 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
fff0: 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
10000 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
10010 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64  r && u<p->nField
10020 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
10030 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
10040 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
10050 28 20 61 4b 65 79 2b 69 64 78 2c 20 73 65 72 69  ( aKey+idx, seri
10060 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66  al_type);.    if
10070 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c  ( d>=nKey && sql
10080 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
10090 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
100a0 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e)>0 ) break;.  
100b0 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
100c0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
100d0 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
100e0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d  Info->db;.    pM
100f0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em->flags = 0;. 
10100 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
10110 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
10120 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10130 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
10140 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
10150 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
10160 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e    u++;.  }.  p->
10170 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65  nField = u;.  re
10180 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d  turn (void*)p;.}
10190 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
101a0 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20  tine destroys a 
101b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f  UnpackedRecord o
101c0 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
101d0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
101e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e  npackedRecord(Un
101f0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
10200 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
10210 20 69 66 28 20 70 2d 3e 6e 65 65 64 44 65 73 74   if( p->needDest
10220 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  roy ){.      int
10230 20 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70   i;.      Mem *p
10240 4d 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Mem;.      for(i
10250 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d  =0, pMem=p->aMem
10260 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69  ; i<p->nField; i
10270 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  ++, pMem++){.   
10280 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a       if( pMem->z
10290 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
102a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
102b0 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
102c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
102d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
102e0 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 29 7b 0a   p->needFree ){.
102f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10300 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  ree(p->pKeyInfo-
10310 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  >db, p);.    }. 
10320 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
10330 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
10340 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
10350 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
10360 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
10370 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
10380 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
10390 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
103a0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
103b0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
103c0 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c  teger if {nKey1,
103d0 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20   pKey1} is less 
103e0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
103f0 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
10400 61 6e 20 70 50 4b 65 79 32 2e 20 20 54 68 65 20  an pPKey2.  The 
10410 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
10420 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
10430 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
10440 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
10450 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
10460 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
10470 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
10480 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
10490 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
104a0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
104b0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
104c0 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
104d0 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
104e0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
104f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
10500 64 73 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ds..** But if th
10510 65 20 6c 65 6e 67 74 68 73 20 64 69 66 66 65 72  e lengths differ
10520 2c 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20 74  , Key2 must be t
10530 68 65 20 73 68 6f 72 74 65 72 20 6f 66 20 74 68  he shorter of th
10540 65 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 48 69 73  e two..**.** His
10550 74 6f 72 69 63 61 6c 20 6e 6f 74 65 3a 20 49 6e  torical note: In
10560 20 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   earlier version
10570 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
10580 65 20 62 6f 74 68 20 4b 65 79 31 0a 2a 2a 20 61  e both Key1.** a
10590 6e 64 20 4b 65 79 32 20 77 65 72 65 20 62 6c 6f  nd Key2 were blo
105a0 62 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  bs obtained from
105b0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20   OP_MakeRecord. 
105c0 20 42 75 74 20 77 65 20 66 6f 75 6e 64 0a 2a 2a   But we found.**
105d0 20 74 68 61 74 20 69 6e 20 74 79 70 69 63 61 6c   that in typical
105e0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 4b 65   use the same Ke
105f0 79 32 20 77 6f 75 6c 64 20 62 65 20 73 75 62 6d  y2 would be subm
10600 69 74 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  itted multiple t
10610 69 6d 65 73 0a 2a 2a 20 69 6e 20 61 20 72 6f 77  imes.** in a row
10620 2e 20 20 53 6f 20 61 6e 20 6f 70 74 69 6d 69 7a  .  So an optimiz
10630 61 74 69 6f 6e 20 77 61 73 20 61 64 64 65 64 20  ation was added 
10640 74 6f 20 70 61 72 73 65 20 74 68 65 20 4b 65 79  to parse the Key
10650 32 20 6b 65 79 0a 2a 2a 20 73 65 70 61 72 61 74  2 key.** separat
10660 65 6c 79 20 61 6e 64 20 73 75 62 6d 69 74 20 74  ely and submit t
10670 68 65 20 70 61 72 73 65 64 20 76 65 72 73 69 6f  he parsed versio
10680 6e 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  n.  In this way,
10690 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 70 61 72   we avoid.** par
106a0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 4b 65  sing the same Ke
106b0 79 32 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  y2 multiple time
106c0 73 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2f 0a 69  s in a row..*/.i
106d0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
106e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69  cordCompare(.  i
106f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
10700 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20  void *pKey1, .  
10710 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
10720 70 50 4b 65 79 32 0a 29 7b 0a 20 20 75 33 32 20  pPKey2.){.  u32 
10730 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
10740 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
10750 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
10760 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
10770 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
10780 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
10790 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
107a0 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
107b0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
107c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
107d0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
107e0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
107f0 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
10800 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
10810 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10820 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
10830 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10840 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
10850 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
10860 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
10870 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
10880 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
10890 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
108a0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
108b0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
108c0 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73  db;.  mem1.flags
108d0 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61   = 0;.  mem1.zMa
108e0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69  lloc = 0;.  .  i
108f0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
10900 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
10910 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
10920 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
10930 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
10940 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
10950 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
10960 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
10970 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
10980 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
10990 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
109a0 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
109b0 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
109c0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
109d0 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
109e0 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
109f0 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
10a00 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
10a10 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
10a20 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
10a30 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
10a40 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
10a50 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
10a60 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
10a70 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
10a80 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
10a90 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
10aa0 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
10ab0 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
10ac0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
10ad0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10ae0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
10af0 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
10b00 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
10b30 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
10b40 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
10b50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  !=0 ){.      bre
10b60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  ak;.    }.    i+
10b70 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d  +;.  }.  if( mem
10b80 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  1.zMalloc ) sqli
10b90 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
10ba0 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20  e(&mem1);..  /* 
10bb0 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  One of the keys 
10bc0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
10bd0 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66  s, but all the f
10be0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
10bf0 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65   point.  ** were
10c00 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69   equal. If the i
10c10 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74  ncrKey flag is t
10c20 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65  rue, then the se
10c30 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a  cond key is.  **
10c40 20 74 72 65 61 74 65 64 20 61 73 20 6c 61 72 67   treated as larg
10c50 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
10c60 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
10c70 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65  pKeyInfo->incrKe
10c80 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
10c90 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  -1;.    }else if
10ca0 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65  ( !pKeyInfo->pre
10cb0 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20  fixIsEqual ){.  
10cc0 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31      if( d1<nKey1
10cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10ce0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
10cf0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b  }.  }else if( pK
10d00 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
10d10 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f  er && i<pKeyInfo
10d20 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20  ->nField.       
10d30 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49          && pKeyI
10d40 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
10d50 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d  i] ){.    rc = -
10d60 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
10d70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
10d80 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
10d90 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f  n index entry co
10da0 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65  mposed using the
10db0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
10dc0 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61  pcode..** The la
10dd0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  st entry in this
10de0 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
10df0 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70  e an integer (sp
10e00 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e  ecifically.** an
10e10 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e   integer rowid).
10e20 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
10e30 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
10e40 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a  r of bytes in.**
10e50 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a   that integer..*
10e60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
10e70 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e  eIdxRowidLen(con
10e80 73 74 20 75 38 20 2a 61 4b 65 79 2c 20 69 6e 74  st u8 *aKey, int
10e90 20 6e 4b 65 79 2c 20 69 6e 74 20 2a 70 52 6f 77   nKey, int *pRow
10ea0 69 64 4c 65 6e 29 7b 0a 20 20 75 33 32 20 73 7a  idLen){.  u32 sz
10eb0 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
10ec0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
10ed0 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
10ee0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
10ef0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
10f00 6f 77 69 64 20 2a 2f 0a 0a 20 20 28 76 6f 69 64  owid */..  (void
10f10 29 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65  )getVarint32(aKe
10f20 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 69 66 28  y, szHdr);.  if(
10f30 20 73 7a 48 64 72 3e 6e 4b 65 79 20 29 7b 0a 20   szHdr>nKey ){. 
10f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10f50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10f60 20 7d 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61   }.  (void)getVa
10f70 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48  rint32(&aKey[szH
10f80 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
10f90 29 3b 0a 20 20 2a 70 52 6f 77 69 64 4c 65 6e 20  );.  *pRowidLen 
10fa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
10fb0 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
10fc0 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  owid);.  return 
10fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 20 20 0a  SQLITE_OK;.}.  .
10fe0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
10ff0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
11000 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
11010 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
11020 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
11030 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
11040 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
11050 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
11060 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
11070 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
11080 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
11090 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
110a0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
110b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
110c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
110d0 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
110e0 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
110f0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
11100 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
11110 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
11120 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11130 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
11140 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
11150 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
11160 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
11170 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
11180 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11190 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
111a0 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
111b0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
111c0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
111d0 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
111e0 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
111f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11200 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 2e 66  _BKPT;.  }.  m.f
11210 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62  lags = 0;.  m.db
11220 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f   = 0;.  m.zMallo
11230 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  c = 0;.  rc = sq
11240 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
11250 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 6e  Btree(pCur, 0, n
11260 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
11270 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
11280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11290 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
112a0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
112b0 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67 65  Hdr);.  (void)ge
112c0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
112d0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
112e0 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52  peRowid);.  lenR
112f0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
11300 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
11310 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71  typeRowid);.  sq
11320 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
11330 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
11340 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
11350 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
11360 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
11370 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
11380 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
11390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
113a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
113b0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
113c0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
113d0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
113e0 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  nt to against.**
113f0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
11400 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67  in pKey (of leng
11410 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65  th nKey).  Write
11420 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
11430 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
11440 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
11450 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
11460 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
11470 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
11480 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65  greater than pKe
11490 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
114a0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
114b0 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65  .**.** pKey is e
114c0 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
114d0 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
114e0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
114f0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
11500 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
11510 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
11520 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
11530 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
11540 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
11550 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  s well..*/.int s
11560 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
11570 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f  Compare(.  Curso
11580 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
11590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
115a0 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
115b0 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
115c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
115d0 70 61 63 6b 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  packed,.  int nK
115e0 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ey, const u8 *pK
115f0 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  ey,   /* The key
11600 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
11610 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11630 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
11640 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
11650 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
11660 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
11670 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
11680 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
11690 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f  sor;.  int lenRo
116a0 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 20 20  wid;.  Mem m;.  
116b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
116c0 70 52 65 63 3b 0a 20 20 63 68 61 72 20 7a 53 70  pRec;.  char zSp
116d0 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 73 71 6c  ace[200];..  sql
116e0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
116f0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
11700 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
11710 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73  y<=0 ){.    *res
11720 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
11730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11740 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e    m.db = 0;.  m.
11750 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a  flags = 0;.  m.z
11760 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 66  Malloc = 0;.  if
11770 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56  ( (rc = sqlite3V
11780 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
11790 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
117a0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
117b0 29 0a 20 20 20 7c 7c 20 28 72 63 20 3d 20 73 71  ).   || (rc = sq
117c0 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
117d0 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 2c 20 6d  dLen((u8*)m.z, m
117e0 2e 6e 2c 20 26 6c 65 6e 52 6f 77 69 64 29 29 0a  .n, &lenRowid)).
117f0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
11800 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  rc;.  }.  if( !p
11810 55 6e 70 61 63 6b 65 64 20 29 7b 0a 20 20 20 20  Unpacked ){.    
11820 70 52 65 63 20 3d 20 73 71 6c 69 74 65 33 56 64  pRec = sqlite3Vd
11830 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
11840 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  C->pKeyInfo, nKe
11850 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 20 20 20 20 20 7a 53 70 61 63 65 2c           zSpace,
11880 20 73 69 7a 65 6f 66 28 7a 53 70 61 63 65 29 29   sizeof(zSpace))
11890 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
118a0 52 65 63 20 3d 20 70 55 6e 70 61 63 6b 65 64 3b  Rec = pUnpacked;
118b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 63 3d  .  }.  if( pRec=
118c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
118d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
118e0 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69   }.  *res = sqli
118f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
11900 70 61 72 65 28 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  pare(m.n-lenRowi
11910 64 2c 20 6d 2e 7a 2c 20 70 52 65 63 29 3b 0a 20  d, m.z, pRec);. 
11920 20 69 66 28 20 21 70 55 6e 70 61 63 6b 65 64 20   if( !pUnpacked 
11930 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11940 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
11950 52 65 63 6f 72 64 28 70 52 65 63 29 3b 0a 20 20  Record(pRec);.  
11960 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
11970 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
11980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
119a0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
119b0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
119c0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
119d0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
119e0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
119f0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
11a00 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
11a10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11a20 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
11a30 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
11a40 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
11a50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11a60 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
11a70 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
11a80 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
11a90 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
11aa0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
11ab0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
11ac0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
11ad0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
11ae0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
11af0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
11b00 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
11b10 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
11b20 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
11b30 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
11b40 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
11b50 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
11b60 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
11b70 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
11b80 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
11b90 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
11ba0 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
11bb0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
11bc0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
11bd0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
11be0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
11bf0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
11c00 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
11c10 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
11c20 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
11c30 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
11c40 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
11c50 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
11c60 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
11c70 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
11c80 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
11c90 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
11ca0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
11cb0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
11cc0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
11cd0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
11ce0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
11cf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11d00 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
11d10 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
11d20 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
11d30 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
11d40 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
11d50 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
11d60 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
11d70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11d80 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
11d90 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
11da0 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
11db0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
11dc0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
11dd0 20 76 2d 3e 64 62 3b 0a 7d 0a                     v->db;.}.