/ Hex Artifact Content
Login

Artifact 6a29a0e372b48bf3b305feb4d1126ada20d61c02:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03d0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03e0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
0400: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0410: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0420: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0430: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0440: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0450: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0470: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
0480: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
0490: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04b0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04c0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
04d0: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
04e0: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
04f0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0500: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0510: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0520: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0530: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
0540: 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20  emember the SQL 
0550: 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65  string for a pre
0560: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
0570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0580: 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 65 20  VdbeSetSql(Vdbe 
0590: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
05a0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28  z, int n){.  if(
05b0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
05c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
05d0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
05e0: 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 44  l = sqlite3StrND
05f0: 75 70 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  up(z, n);.}../*.
0600: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51  ** Return the SQ
0610: 4c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  L associated wit
0620: 68 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  h a prepared sta
0630: 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20  tement.*/.const 
0640: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 56 64 62  char *sqlite3Vdb
0650: 65 47 65 74 53 71 6c 28 56 64 62 65 20 2a 70 29  eGetSql(Vdbe *p)
0660: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 53  {.  return p->zS
0670: 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  ql;.}../*.** Swa
0680: 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65  p all content be
0690: 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73  tween two VDBE s
06a0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
06b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77  id sqlite3VdbeSw
06c0: 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62  ap(Vdbe *pA, Vdb
06d0: 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74  e *pB){.  Vdbe t
06e0: 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61  mp, *pTmp;.  cha
06f0: 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e 74 20 6e  r *zTmp;.  int n
0700: 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41  Tmp;.  tmp = *pA
0710: 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20  ;.  *pA = *pB;. 
0720: 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54   *pB = tmp;.  pT
0730: 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a  mp = pA->pNext;.
0740: 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42    pA->pNext = pB
0750: 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70  ->pNext;.  pB->p
0760: 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70  Next = pTmp;.  p
0770: 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b  Tmp = pA->pPrev;
0780: 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70  .  pA->pPrev = p
0790: 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e  B->pPrev;.  pB->
07a0: 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20  pPrev = pTmp;.  
07b0: 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b  zTmp = pA->zSql;
07c0: 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42  .  pA->zSql = pB
07d0: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53  ->zSql;.  pB->zS
07e0: 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 6e 54 6d  ql = zTmp;.  nTm
07f0: 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b 0a 20 20  p = pA->nSql;.  
0800: 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42 2d 3e 6e  pA->nSql = pB->n
0810: 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53 71 6c 20  Sql;.  pB->nSql 
0820: 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69 66 64 65  = nTmp;.}..#ifde
0830: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0840: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0850: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0860: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0870: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0880: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0890: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
08a0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
08b0: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
08c0: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
08d0: 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  t it contains at
08e0: 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d   least N.** elem
08f0: 65 6e 74 73 2e 20 49 66 20 74 68 65 20 56 64 62  ents. If the Vdb
0900: 65 20 69 73 20 69 6e 20 56 44 42 45 5f 4d 41 47  e is in VDBE_MAG
0910: 49 43 5f 52 55 4e 20 73 74 61 74 65 2c 20 74 68  IC_RUN state, th
0920: 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 61  en.** the Vdbe.a
0930: 4f 70 20 61 72 72 61 79 20 77 69 6c 6c 20 62 65  Op array will be
0940: 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e 74 61 69   sized to contai
0950: 6e 20 65 78 61 63 74 6c 79 20 4e 0a 2a 2a 20 65  n exactly N.** e
0960: 6c 65 6d 65 6e 74 73 2e 20 56 64 62 65 2e 6e 4f  lements. Vdbe.nO
0970: 70 41 6c 6c 6f 63 20 69 73 20 73 65 74 20 74 6f  pAlloc is set to
0980: 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
0990: 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
09a0: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  array..**.** If 
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09e0: 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64 62 65 2e   array,.** Vdbe.
09f0: 61 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70  aOp and Vdbe.nOp
0a00: 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 75 6e 63  Alloc remain unc
0a10: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
0a20: 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e 79 20 6f  so that.** any o
0a30: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a40: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a50: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0a60: 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
0a70: 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ith the rest of 
0a80: 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74  the Vdbe)..*/.st
0a90: 61 74 69 63 20 76 6f 69 64 20 72 65 73 69 7a 65  atic void resize
0aa0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
0ab0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72   int N){.  int r
0ac0: 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d 61 67 69  unMode = p->magi
0ad0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
0ae0: 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d 6f 64 65  N;.  if( runMode
0af0: 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c   || p->nOpAlloc<
0b00: 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  N ){.    VdbeOp 
0b10: 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
0b20: 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30 2a 28 21  New = N + 100*(!
0b30: 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e  runMode);.    in
0b40: 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e  t oldSize = p->n
0b50: 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e 65  OpAlloc;.    pNe
0b60: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
0b70: 63 28 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  c(p->aOp, nNew*s
0b80: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20  izeof(Op));.    
0b90: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0ba0: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0bb0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nNew;.      p->a
0bc0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  Op = pNew;.     
0bd0: 20 69 66 28 20 6e 4e 65 77 3e 6f 6c 64 53 69 7a   if( nNew>oldSiz
0be0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
0bf0: 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53  set(&p->aOp[oldS
0c00: 69 7a 65 5d 2c 20 30 2c 20 28 6e 4e 65 77 2d 6f  ize], 0, (nNew-o
0c10: 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f  ldSize)*sizeof(O
0c20: 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p));.      }.   
0c30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
0c40: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75  Add a new instru
0c50: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73  ction to the lis
0c60: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
0c70: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65  s current in the
0c80: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72  .** VDBE.  Retur
0c90: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
0ca0: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
0cb0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  tion..**.** Para
0cc0: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  meters:.**.**   
0cd0: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20   p              
0ce0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
0cf0: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70  VDBE.**.**    op
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
0d10: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69  e opcode for thi
0d20: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
0d30: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20  .**    p1, p2   
0d40: 20 20 20 20 20 20 20 46 69 72 73 74 20 74 77 6f         First two
0d50: 20 6f 66 20 74 68 65 20 74 68 72 65 65 20 70 6f   of the three po
0d60: 73 73 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e  ssible operands.
0d70: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
0d80: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
0d90: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
0da0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
0db0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
0dc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
0dd0: 50 33 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P3() function to
0de0: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
0df0: 65 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f  e of the P3.** o
0e00: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73  perand..*/.int s
0e10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0e20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0e30: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
0e40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0e50: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
0e60: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
0e70: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
0e80: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
0e90: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0ea0: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69  c<=i ){.    resi
0eb0: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31  zeOpArray(p, i+1
0ec0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
0ed0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
0ee0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0ef0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0f00: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
0f10: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0f20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70  pOp->opcode = op
0f30: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
0f40: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
0f50: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b  ;.  pOp->p3 = 0;
0f60: 0a 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d  .  pOp->p3type =
0f70: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P3_NOTUSED;.  p
0f80: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23  ->expired = 0;.#
0f90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
0fa0: 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  UG.  if( sqlite3
0fb0: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0fc0: 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 50  e ) sqlite3VdbeP
0fd0: 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d  rintOp(0, i, &p-
0fe0: 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66  >aOp[i]);.#endif
0ff0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
1000: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1010: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1020: 73 20 74 68 65 20 70 33 20 76 61 6c 75 65 2e 0a  s the p3 value..
1030: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1040: 62 65 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  beOp3(Vdbe *p, i
1050: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1060: 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63 68 61  nt p2, const cha
1070: 72 20 2a 7a 50 33 2c 69 6e 74 20 70 33 74 79 70  r *zP3,int p3typ
1080: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  e){.  int addr =
1090: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a0: 70 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29  p(p, op, p1, p2)
10b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
10c0: 68 61 6e 67 65 50 33 28 70 2c 20 61 64 64 72 2c  hangeP3(p, addr,
10d0: 20 7a 50 33 2c 20 70 33 74 79 70 65 29 3b 0a 20   zP3, p3type);. 
10e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
10f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1100: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
1110: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
1120: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
1130: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
1140: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1150: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1160: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1170: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
1180: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
1190: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
11a0: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
11b0: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
11c0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
11d0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
11e0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
11f0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1200: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1210: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1220: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1230: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1240: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1250: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1260: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1270: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1280: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
1290: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
12a0: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
12b0: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
12c0: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
12d0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
12e0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
12f0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1300: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1310: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1320: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1330: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1340: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1350: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1360: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1370: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1380: 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  bel(Vdbe *p){.  
1390: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e  int i;.  i = p->
13a0: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
13b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
13c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
13d0: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61  .  if( i>=p->nLa
13e0: 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  belAlloc ){.    
13f0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
1400: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
1410: 32 20 2b 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61  2 + 10;.    p->a
1420: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 52 65  Label = sqliteRe
1430: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 61  allocOrFree(p->a
1440: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c             p->nL
1470: 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  abelAlloc*sizeof
1480: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
1490: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
14a0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
14b0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
14c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69   }.  return -1-i
14d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
14e0: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
14f0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
1500: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
1510: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
1520: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
1530: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
1540: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1550: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
1560: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
1570: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1580: 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  l()..*/.void sql
1590: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15a0: 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e  abel(Vdbe *p, in
15b0: 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20  t x){.  int j = 
15c0: 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20  -1-x;.  assert( 
15d0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15e0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
15f0: 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a  ssert( j>=0 && j
1600: 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  <p->nLabel );.  
1610: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1620: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a  .    p->aLabel[j
1630: 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a  ] = p->nOp;.  }.
1640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1650: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70 63 6f  non-zero if opco
1660: 64 65 20 27 6f 70 27 20 69 73 20 67 75 61 72 65  de 'op' is guare
1670: 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70 75 73  nteed not to pus
1680: 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a 2a 2a  h more values.**
1690: 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45 20 73   onto the VDBE s
16a0: 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70 6f 70  tack than it pop
16b0: 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  s off..*/.static
16c0: 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50 75 73   int opcodeNoPus
16d0: 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a 20 54  h(u8 op){.  /* T
16e0: 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d 41 53  he 10 NOPUSH_MAS
16f0: 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  K_n constants ar
1700: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  e defined in the
1710: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
1720: 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 68 65   ** generated he
1730: 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f 64 65  ader file opcode
1740: 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61 20 31  s.h. Each is a 1
1750: 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c 20 6f  6-bit bitmask, o
1760: 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f 72 72  ne.  ** bit corr
1770: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 61 63  esponding to eac
1780: 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65 6d 65  h opcode impleme
1790: 6e 74 65 64 20 62 79 20 74 68 65 20 76 69 72 74  nted by the virt
17a0: 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69 6e 65  ual.  ** machine
17b0: 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68 65 20   in vdbe.c. The 
17c0: 62 69 74 20 69 73 20 74 72 75 65 20 69 66 20 74  bit is true if t
17d0: 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75 73 68  he word "no-push
17e0: 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a 20 69  " appears.  ** i
17f0: 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  n a comment on t
1800: 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61 73 20  he same line as 
1810: 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58 58 58  the "case OP_XXX
1820: 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71 6c 69  :" in .  ** sqli
1830: 74 65 33 56 64 62 65 45 78 65 63 28 29 20 69 6e  te3VdbeExec() in
1840: 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a 20 20   vdbe.c..  **.  
1850: 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20 69 73  ** If the bit is
1860: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
1870: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70  corresponding op
1880: 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e 74 65  code is guarente
1890: 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f 20 67  ed not.  ** to g
18a0: 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20 77 68  row the stack wh
18b0: 65 6e 20 69 74 20 69 73 20 65 78 65 63 75 74 65  en it is execute
18c0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
18d0: 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a 20 20   may grow the.  
18e0: 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74 20 6d  ** stack by at m
18f0: 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e 0a 20  ost one entry.. 
1900: 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53 48 5f   **.  ** NOPUSH_
1910: 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70 6f 6e  MASK_0 correspon
1920: 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20 30 20  ds to opcodes 0 
1930: 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f 4d 41  to 15. NOPUSH_MA
1940: 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a 20 20  SK_1 contains.  
1950: 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 6f  ** one bit for o
1960: 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33 31 2c  pcodes 16 to 31,
1970: 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20 2a 2a   and so on..  **
1980: 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62 69 74  .  ** 16-bit bit
1990: 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20 74 68  masks (rather th
19a0: 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65 20 73  an 32-bit) are s
19b0: 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70 63 6f  pecified in opco
19c0: 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65 63 61  des.h .  ** beca
19d0: 75 73 65 20 74 68 65 20 66 69 6c 65 20 69 73 20  use the file is 
19e0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
19f0: 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41 77 6b  awk program. Awk
1a00: 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20 20 2a   manipulates.  *
1a10: 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20 61 73  * all numbers as
1a20: 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20   floating-point 
1a30: 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77 61 6e  and we don't wan
1a40: 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f 75 6e  t to risk a roun
1a50: 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 20  ding.  ** error 
1a60: 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69 6c 64  if someone build
1a70: 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20 74 68  s with an awk th
1a80: 61 74 20 75 73 65 73 20 28 66 6f 72 20 65 78 61  at uses (for exa
1a90: 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a 20 20  mple) 32-bit .  
1aa0: 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73 2e 0a  ** IEEE floats..
1ab0: 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63 20 63    */ .  static c
1ac0: 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73 5b 35  onst u32 masks[5
1ad0: 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55 53 48  ] = {.    NOPUSH
1ae0: 5f 4d 41 53 4b 5f 30 20 2b 20 28 28 28 75 6e 73  _MASK_0 + (((uns
1af0: 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53  igned)NOPUSH_MAS
1b00: 4b 5f 31 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e  K_1)<<16),.    N
1b10: 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20 2b 20 28  OPUSH_MASK_2 + (
1b20: 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53  ((unsigned)NOPUS
1b30: 48 5f 4d 41 53 4b 5f 33 29 3c 3c 31 36 29 2c 0a  H_MASK_3)<<16),.
1b40: 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f      NOPUSH_MASK_
1b50: 34 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29  4 + (((unsigned)
1b60: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 29 3c 3c  NOPUSH_MASK_5)<<
1b70: 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f  16),.    NOPUSH_
1b80: 4d 41 53 4b 5f 36 20 2b 20 28 28 28 75 6e 73 69  MASK_6 + (((unsi
1b90: 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b  gned)NOPUSH_MASK
1ba0: 5f 37 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f  _7)<<16),.    NO
1bb0: 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20 28 28  PUSH_MASK_8 + ((
1bc0: 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48  (unsigned)NOPUSH
1bd0: 5f 4d 41 53 4b 5f 39 29 3c 3c 31 36 29 0a 20 20  _MASK_9)<<16).  
1be0: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3c  };.  assert( op<
1bf0: 33 32 2a 35 20 29 3b 0a 20 20 72 65 74 75 72 6e  32*5 );.  return
1c00: 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d 20 26   (masks[op>>5] &
1c10: 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29 29 29   (1<<(op&0x1F)))
1c20: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1c30: 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  BUG.int sqlite3V
1c40: 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73 68 28  dbeOpcodeNoPush(
1c50: 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  u8 op){.  return
1c60: 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70   opcodeNoPush(op
1c70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1c80: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
1c90: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
1ca0: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
1cb0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
1cc0: 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73 75 63  ive..** Each suc
1cd0: 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  h value is a lab
1ce0: 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65  el.  Resolve the
1cf0: 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e   label by settin
1d00: 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61 6c 75  g the P2.** valu
1d10: 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  e to its correct
1d20: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
1d30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
1d50: 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ce after all opc
1d60: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
1d70: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56  nserted..**.** V
1d80: 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e  ariable *pMaxFun
1d90: 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20  cArgs is set to 
1da0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  the maximum valu
1db0: 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75  e of any P2 argu
1dc0: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f  ment .** to an O
1dd0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41  P_Function, OP_A
1de0: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69  ggStep or OP_VFi
1df0: 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69  lter opcode. Thi
1e00: 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  s is used by .**
1e10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1e20: 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20  Ready() to size 
1e30: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
1e40: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   array..**.** Th
1e50: 65 20 69 6e 74 65 67 65 72 20 2a 70 4d 61 78 53  e integer *pMaxS
1e60: 74 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 74  tack is set to t
1e70: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
1e80: 72 20 6f 66 20 76 64 62 65 20 73 74 61 63 6b 0a  r of vdbe stack.
1e90: 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ** entries that 
1ea0: 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20  static analysis 
1eb0: 72 65 76 65 61 6c 73 20 74 68 69 73 20 70 72 6f  reveals this pro
1ec0: 67 72 61 6d 20 6d 69 67 68 74 20 6e 65 65 64 2e  gram might need.
1ed0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ee0: 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68  ine also does th
1ef0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69  e following opti
1f00: 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63  mization:  It sc
1f10: 61 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c 74 20  ans for.** Halt 
1f20: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65  instructions whe
1f30: 72 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  re P1==SQLITE_CO
1f40: 4e 53 54 52 41 49 4e 54 20 6f 72 20 50 32 3d 3d  NSTRAINT or P2==
1f50: 4f 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f 72 0a  OE_Abort or for.
1f60: 2a 2a 20 49 64 78 49 6e 73 65 72 74 20 69 6e 73  ** IdxInsert ins
1f70: 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72 65 20  tructions where 
1f80: 50 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20 73 75  P2!=0.  If no su
1f90: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
1fa0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 6e  s.** found, then
1fb0: 20 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74   every Statement
1fc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1fd0: 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f  changed to a Noo
1fe0: 70 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73 20 77  p.  In.** this w
1ff0: 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65  ay, we avoid cre
2000: 61 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  ating the statem
2010: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
2020: 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e 0a   unnecessarily..
2030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2040: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
2050: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
2060: 78 46 75 6e 63 41 72 67 73 2c 20 69 6e 74 20 2a  xFuncArgs, int *
2070: 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20 69 6e  pMaxStack){.  in
2080: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
2090: 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  rgs = 0;.  int n
20a0: 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e 6e 4f  MaxStack = p->nO
20b0: 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  p;.  Op *pOp;.  
20c0: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
20d0: 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64  >aLabel;.  int d
20e0: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
20f0: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  back = 0;.  int 
2100: 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69  hasStatementBegi
2110: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70  n = 0;.  for(pOp
2120: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2130: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2140: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  pOp++){.    u8 o
2150: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2160: 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70  ode;..    if( op
2170: 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f  code==OP_Functio
2180: 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  n || opcode==OP_
2190: 41 67 67 53 74 65 70 20 0a 23 69 66 6e 64 65 66  AggStep .#ifndef
21a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
21b0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
21c0: 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f    || opcode==OP_
21d0: 56 55 70 64 61 74 65 0a 23 65 6e 64 69 66 0a 20  VUpdate.#endif. 
21e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
21f0: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
2200: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2210: 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20  p->p2;.    }.   
2220: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2230: 48 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66  Halt ){.      if
2240: 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54  ( pOp->p1==SQLIT
2250: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2260: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
2270: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65  t ){.        doe
2280: 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61  sStatementRollba
2290: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
22a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
22b0: 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65  code==OP_Stateme
22c0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53  nt ){.      hasS
22d0: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20  tatementBegin = 
22e0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
22f0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2300: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
2310: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
2320: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
2330: 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20  OP_VRename ){.  
2340: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
2350: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
2360: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2370: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
2380: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
2390: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
23a0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
23b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23c0: 4f 70 5b 2d 32 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-2].opcode==O
23d0: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
23e0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 32 5d 2e 70     n = pOp[-2].p
23f0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
2400: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2410: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
2420: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
2430: 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65  odeNoPush(opcode
2440: 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53  ) ){.      nMaxS
2450: 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20  tack--;.    }.. 
2460: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d     if( pOp->p2>=
2470: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2480: 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70    assert( -1-pOp
2490: 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  ->p2<p->nLabel )
24a0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20  ;.    pOp->p2 = 
24b0: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
24c0: 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2];.  }.  sqlite
24d0: 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  Free(p->aLabel);
24e0: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
24f0: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
2500: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
2510: 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d   *pMaxStack = nM
2520: 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49  axStack;..  /* I
2530: 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62  f we never rollb
2540: 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ack a statement 
2550: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2560: 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  n statement.  **
2570: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
2580: 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  e not needed.  S
2590: 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f  o change every O
25a0: 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  P_Statement.  **
25b0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20   opcode into an 
25c0: 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61  OP_Noop.  This a
25d0: 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73  void a call to s
25e0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
25f0: 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69  usive().  ** whi
2600: 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73  ch can be expens
2610: 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74  ive on some plat
2620: 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  forms..  */.  if
2630: 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  ( hasStatementBe
2640: 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74  gin && !doesStat
2650: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b  ementRollback ){
2660: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  .    for(pOp=p->
2670: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
2680: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
2690: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
26a0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  p->opcode==OP_St
26b0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
26c0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
26d0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
26e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
26f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2700: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
2710: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
2720: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
2730: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2740: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
2750: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
2760: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
2770: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2780: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
2790: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
27a0: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
27b0: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
27c0: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
27d0: 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   Return the.** a
27e0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
27f0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64  rst operation ad
2800: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
2810: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
2820: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f  (Vdbe *p, int nO
2830: 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  p, VdbeOpList co
2840: 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74  nst *aOp){.  int
2850: 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28   addr;.  assert(
2860: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2870: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2880: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
2890: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29 3b 0a   p->nOp + nOp);.
28a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
28b0: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
28c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
28d0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
28e0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b  ;.  if( nOp>0 ){
28f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2900: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
2910: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
2920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
2930: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
2940: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
2950: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
2960: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
2970: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
2980: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
2990: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
29a0: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
29b0: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 70 4f  In->p1;.      pO
29c0: 75 74 2d 3e 70 32 20 3d 20 70 32 3c 30 20 3f 20  ut->p2 = p2<0 ? 
29d0: 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 20  addr + ADDR(p2) 
29e0: 3a 20 70 32 3b 0a 20 20 20 20 20 20 70 4f 75 74  : p2;.      pOut
29f0: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
2a00: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 74 79        pOut->p3ty
2a10: 70 65 20 3d 20 70 49 6e 2d 3e 70 33 20 3f 20 50  pe = pIn->p3 ? P
2a20: 33 5f 53 54 41 54 49 43 20 3a 20 50 33 5f 4e 4f  3_STATIC : P3_NO
2a30: 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51  TUSED;.#ifdef SQ
2a40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
2a50: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62   if( sqlite3_vdb
2a60: 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b  e_addop_trace ){
2a70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a80: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
2a90: 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69  +addr, &p->aOp[i
2aa0: 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d  +addr]);.      }
2ab0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2ac0: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
2ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
2ae0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dr;.}../*.** Cha
2af0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2b00: 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   the P1 operand 
2b10: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2b20: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
2b30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2b40: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
2b50: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
2b60: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
2b70: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
2b80: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
2b90: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
2ba0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
2bb0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
2bc0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
2bd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2be0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
2bf0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2c00: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2c10: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2c20: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2c30: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2c40: 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20  p && addr>=0 && 
2c50: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70  p->nOp>addr && p
2c60: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->aOp ){.    p->
2c70: 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76  aOp[addr].p1 = v
2c80: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2c90: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2ca0: 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72  e of the P2 oper
2cb0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
2cc0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
2cd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ce0: 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  is useful for se
2cf0: 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73  tting a jump des
2d00: 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  tination..*/.voi
2d10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2d20: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69  ngeP2(Vdbe *p, i
2d30: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
2d40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c  ){.  assert( val
2d50: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
2d60: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2d70: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2d80: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2d90: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2da0: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2db0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2dc0: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
2dd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2de0: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
2df0: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
2e00: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
2e10: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
2e20: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2e30: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2e40: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
2e50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2e60: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
2e70: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
2e80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e90: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
2ea0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
2eb0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
2ec0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
2ed0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
2ee0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
2ef0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
2f00: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
2f10: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
2f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f30: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
2f40: 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a  nction(FuncDef *
2f50: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65  pDef){.  if( pDe
2f60: 66 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  f && (pDef->flag
2f70: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2f80: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
2f90: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 65 66   sqliteFree(pDef
2fa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2fb0: 44 65 6c 65 74 65 20 61 20 50 33 20 76 61 6c 75  Delete a P3 valu
2fc0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
2fd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2fe0: 72 65 65 50 33 28 69 6e 74 20 70 33 74 79 70 65  reeP3(int p3type
2ff0: 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69  , void *p3){.  i
3000: 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69  f( p3 ){.    swi
3010: 74 63 68 28 20 70 33 74 79 70 65 20 29 7b 0a 20  tch( p3type ){. 
3020: 20 20 20 20 20 63 61 73 65 20 50 33 5f 44 59 4e       case P3_DYN
3030: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
3040: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P3_KEYINFO:.   
3050: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
3060: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
3070: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3080: 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p3);.        br
3090: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
30a0: 20 20 20 63 61 73 65 20 50 33 5f 4d 50 52 49 4e     case P3_MPRIN
30b0: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  TF: {.        sq
30c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b 0a  lite3_free(p3);.
30d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
30f0: 65 20 50 33 5f 56 44 42 45 46 55 4e 43 3a 20 7b  e P3_VDBEFUNC: {
3100: 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e  .        VdbeFun
3110: 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28  c *pVdbeFunc = (
3120: 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20  VdbeFunc *)p3;. 
3130: 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d         freeEphem
3140: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70 56 64  eralFunction(pVd
3150: 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a  beFunc->pFunc);.
3160: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3170: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
3180: 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a  (pVdbeFunc, 0);.
3190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
31a0: 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20  ee(pVdbeFunc);. 
31b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
31d0: 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P3_FUNCDEF: {. 
31e0: 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d         freeEphem
31f0: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75  eralFunction((Fu
3200: 6e 63 44 65 66 2a 29 70 33 29 3b 0a 20 20 20 20  ncDef*)p3);.    
3210: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3220: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33   }.      case P3
3230: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20  _MEM: {.        
3240: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
3250: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
3260: 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p3);.        br
3270: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3280: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
3290: 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65   Change N opcode
32a0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64  s starting at ad
32b0: 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f  dr to No-ops..*/
32c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
32d0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
32e0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
32f0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
3300: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
3310: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3320: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3330: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b     while( N-- ){
3340: 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 70 4f  .      freeP3(pO
3350: 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p3type, pOp->
3360: 70 33 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  p3);.      memse
3370: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
3380: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20  (pOp[0]));.     
3390: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
33a0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f  P_Noop;.      pO
33b0: 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p++;.    }.  }.}
33c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
33d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
33e0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
33f0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3400: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3410: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3420: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3430: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3440: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3450: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3460: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3470: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3480: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3490: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
34a0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
34b0: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
34c0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 69  the P3 operand i
34d0: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
34e0: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
34f0: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
3500: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
3510: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
3520: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
3530: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
3540: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
3550: 62 79 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20  bytes of zP3 up 
3560: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
3570: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
3580: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
3590: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
35a0: 79 74 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a  ytes of zP3..**.
35b0: 2a 2a 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49  ** If n==P3_KEYI
35c0: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
35d0: 74 20 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74  t zP3 is a point
35e0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
35f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
3600: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
3610: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
3620: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
3630: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
3640: 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2c  ** sqliteMalloc,
3650: 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65   to be freed whe
3660: 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69  n the Vdbe is fi
3670: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50  nalized..** n==P
3680: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
3690: 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  F indicates that
36a0: 20 7a 50 33 20 70 6f 69 6e 74 73 20 74 6f 20 61   zP3 points to a
36b0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
36c0: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
36d0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20  memory that the 
36e0: 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69  caller has obtai
36f0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
3700: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
3710: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
3720: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
3730: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
3740: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3750: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3760: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3770: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3780: 50 33 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f  P3_STATIC, P3_CO
3790: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
37a0: 63 61 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f  cate that zP3 po
37b0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
37c0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
37d0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
37e0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
37f0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3800: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
3810: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
3820: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
3830: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
3840: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3850: 63 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65  change P3 on the
3860: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3870: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3880: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3890: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
38a0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
38b0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
38c0: 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP3, int n){.  O
38d0: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
38e0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
38f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3900: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
3910: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
3920: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
3930: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 69  ailed() ){.    i
3940: 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e  f (n != P3_KEYIN
3950: 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  FO) {.      free
3960: 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  P3(n, (void*)*(c
3970: 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20  har**)&zP3);.   
3980: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
3990: 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20   }.  if( addr<0 
39a0: 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20  || addr>=p->nOp 
39b0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
39c0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
39d0: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
39e0: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
39f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3a00: 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79  freeP3(pOp->p3ty
3a10: 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  pe, pOp->p3);.  
3a20: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 69  pOp->p3 = 0;.  i
3a30: 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20  f( zP3==0 ){.   
3a40: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3a50: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3a60: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P3_NOTUSED;.  }e
3a70: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
3a80: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
3a90: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
3aa0: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
3ab0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
3ac0: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
3ad0: 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP3)->nField;.  
3ae0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
3af0: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
3b00: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
3b10: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3b20: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
3b30: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
3b40: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
3b50: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
3b60: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
3b70: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3b80: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3b90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3ba0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3bb0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3bc0: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
3bd0: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3be0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3bf0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3c00: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3c10: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3c20: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
3c30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3c40: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3c50: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
3c60: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3c70: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
3c80: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3c90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3ca0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3cb0: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
3cc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 2d  else{.      pOp-
3cd0: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  >p3type = P3_NOT
3ce0: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
3cf0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
3d00: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
3d10: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28  .    pOp->p3 = (
3d20: 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70  char*)zP3;.    p
3d30: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
3d40: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
3d50: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
3d60: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
3d70: 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP3;.    pOp->p
3d80: 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c  3type = n;.  }el
3d90: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  se{.    if( n==0
3da0: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50   ) n = strlen(zP
3db0: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20  3);.    pOp->p3 
3dc0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
3dd0: 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP3, n);.    pOp
3de0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
3df0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
3e00: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3e10: 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 50  ** Replace the P
3e20: 33 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  3 field of the m
3e30: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
3e40: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  ed instruction w
3e50: 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74  ith.** comment t
3e60: 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ext..*/.void sql
3e70: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
3e80: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
3e90: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
3ea0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
3ec0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
3ed0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3ee0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
3ef0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d  Op[p->nOp-1].p3=
3f00: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  =0 || sqlite3Mal
3f10: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20  locFailed() );. 
3f20: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
3f30: 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65  ormat);.  sqlite
3f40: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c  3VdbeChangeP3(p,
3f50: 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 4d 50 72   -1, sqlite3VMPr
3f60: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
3f70: 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
3f80: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
3f90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
3fa0: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
3fb0: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
3fc0: 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ess..*/.VdbeOp *
3fd0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
3fe0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3ff0: 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  dr){.  assert( p
4000: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4010: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
4020: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
4030: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
4040: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
4050: 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 72 65 74  ailed() );.  ret
4060: 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26 26  urn ((addr>=0 &&
4070: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26   addr<p->nOp)?(&
4080: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30 29  p->aOp[addr]):0)
4090: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
40a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
40b0: 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e  PLAIN) || !defin
40c0: 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20  ed(NDEBUG) \.   
40d0: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42    || defined(VDB
40e0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
40f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
4100: 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  UG)./*.** Comput
4110: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
4120: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 33  describes the P3
4130: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
4140: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
4150: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
4160: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
4170: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
4180: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
4190: 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f  displayP3(Op *pO
41a0: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
41b0: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
41c0: 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65 72  ar *zP3;.  asser
41d0: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
41e0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
41f0: 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  3type ){.    cas
4200: 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P3_KEYINFO: {.
4210: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
4220: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
4230: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
4240: 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  fo*)pOp->p3;.   
4250: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4260: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4270: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
4280: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4290: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72  );.      i = str
42a0: 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  len(zTemp);.    
42b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
42c0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
42d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
42e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
42f0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
4300: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
4310: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
4320: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
4330: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
4340: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e           if( i+n
4350: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
4360: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
4370: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c  zTemp[i],",...",
4380: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
4390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
43a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65   }.          zTe
43b0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
43c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65           if( pKe
43d0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
43e0: 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  r && pKeyInfo->a
43f0: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a  SortOrder[j] ){.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
4410: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
4420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4430: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4440: 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p[i], pColl->zNa
4450: 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  me,n+1);.       
4460: 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     i += n;.     
4470: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34     }else if( i+4
4480: 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  <nTemp-6 ){.    
4490: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
44a0: 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29  emp[i],",nil",4)
44b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
44c0: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
44d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
44e0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
44f0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
4500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4510: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
4520: 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP3 = zTemp;.  
4530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4540: 0a 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c  .    case P3_COL
4550: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
4560: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
4570: 43 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33  CollSeq*)pOp->p3
4580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4590: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
45a0: 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28  zTemp, "collseq(
45b0: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
45c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50  zName);.      zP
45d0: 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  3 = zTemp;.     
45e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
45f0: 20 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45    case P3_FUNCDE
4600: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
4610: 65 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63  ef *pDef = (Func
4620: 44 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Def*)pOp->p3;.  
4630: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4640: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4650: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
4660: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
4670: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 7a 50 33  nArg);.      zP3
4680: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
4690: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
46a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
46b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
46c0: 20 20 63 61 73 65 20 50 33 5f 56 54 41 42 3a 20    case P3_VTAB: 
46d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
46e0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 73  vtab *pVtab = (s
46f0: 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 4f 70  qlite3_vtab*)pOp
4700: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->p3;.      sqli
4710: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4720: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
4730: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
4740: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
4750: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
4760: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
4770: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4780: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4790: 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70 33     zP3 = pOp->p3
47a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 33 3d  ;.      if( zP3=
47b0: 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  =0 || pOp->opcod
47c0: 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  e==OP_Noop ){.  
47d0: 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22 3b 0a        zP3 = "";.
47e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
47f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 33 21  }.  assert( zP3!
4800: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
4810: 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  P3;.}.#endif...#
4820: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
4830: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
4840: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
4850: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
4860: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
4870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4880: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
4890: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
48a0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
48b0: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
48c0: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
48d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20  {.  char *zP3;. 
48e0: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
48f0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
4900: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
4910: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
4920: 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  4d %s\n";.  if( 
4930: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
4940: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d   stdout;.  zP3 =
4950: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
4960: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
4970: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
4980: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20  Out, zFormat1,. 
4990: 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33       pc, sqlite3
49a0: 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d  OpcodeNames[pOp-
49b0: 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70  >opcode], pOp->p
49c0: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29  1, pOp->p2, zP3)
49d0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
49e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
49f0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
4a00: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
4a10: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
4a20: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
4a30: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
4a40: 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  N){.  if( p ){. 
4a50: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20     while( N-->0 
4a60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4a70: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
4a80: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ++);.    }.  }.}
4a90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4aa0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
4ab0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
4ac0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
4ad0: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
4ae0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
4af0: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
4b00: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
4b10: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
4b20: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
4b30: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
4b40: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
4b50: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
4b60: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
4b70: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4b80: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
4b90: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
4ba0: 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73  PLAIN"..*/.int s
4bb0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
4bc0: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4be0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
4bf0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4c00: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
4c10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4c20: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
4c30: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  ->explain );.  i
4c40: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
4c50: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65  E_MAGIC_RUN ) re
4c60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
4c70: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  SE;.  assert( db
4c80: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
4c90: 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20  MAGIC_BUSY );.  
4ca0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
4cb0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
4cc0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
4cd0: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
4ce0: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
4cf0: 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e  does not put dyn
4d00: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74  amic strings ont
4d10: 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73  o the.  ** the s
4d20: 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62  tack, they may b
4d30: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
4d40: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
4d50: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
4d60: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
4d70: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
4d80: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
4d90: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  coding..  */.  i
4da0: 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e  f( p->pTos==&p->
4db0: 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20  aStack[4] ){.   
4dc0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
4dd0: 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a  (p->aStack, 5);.
4de0: 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74    }.  p->resOnSt
4df0: 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a  ack = 0;..  do{.
4e00: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
4e10: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e  .  }while( i<p->
4e20: 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  nOp && p->explai
4e30: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
4e40: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
4e50: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
4e60: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
4e70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
4e80: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
4e90: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
4ea0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
4eb0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
4ec0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
4ed0: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
4ee0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
4ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
4f00: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
4f10: 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  g, sqlite3ErrStr
4f20: 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29  (p->rc), (char*)
4f30: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
4f40: 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61   Op *pOp = &p->a
4f50: 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a  Op[i];.    Mem *
4f60: 70 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b  pMem = p->aStack
4f70: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
4f80: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
4f90: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
4fa0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
4fb0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
4ff0: 65 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  er */.    pMem++
5000: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
5010: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
5020: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
5030: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
5040: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
5050: 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f  codeNames[pOp->o
5060: 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f  pcode];  /* Opco
5070: 64 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  de */.    assert
5080: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
5090: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
50a0: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
50b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
50c0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
50d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
50e0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d  ITE_UTF8;.    pM
50f0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
5100: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5110: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
5120: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
5150: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5160: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5170: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5180: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5190: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
51a0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
51d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
51e0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
51f0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5200: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5210: 20 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53   MEM_Ephem|MEM_S
5220: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 2f  tr|MEM_Term;   /
5230: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P3 */.    pMem
5240: 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 33 28  ->z = displayP3(
5250: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72  pOp, pMem->zShor
5260: 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  t, sizeof(pMem->
5270: 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 61 73  zShort));.    as
5280: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
5290: 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20   );.    pMem->n 
52a0: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
52b0: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  );.    pMem->typ
52c0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
52d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
52e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20   SQLITE_UTF8;.. 
52f0: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
5300: 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70   = 5 - 2*(p->exp
5310: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
5320: 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  pTos = pMem;.   
5330: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5340: 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e  OK;.    p->resOn
5350: 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72  Stack = 1;.    r
5360: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
5370: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5380: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5390: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
53a0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
53b0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
53c0: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
53d0: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
53e0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
53f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
5400: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
5410: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
5420: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
5430: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
5440: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
5450: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
5460: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
5470: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
5480: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
5490: 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  >p3!=0 ){.    co
54a0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
54b0: 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c 65  p->p3;.    while
54c0: 28 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29  ( isspace(*(u8*)
54d0: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72  z) ) z++;.    pr
54e0: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
54f0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
5500: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
5510: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
5520: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
5530: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
5540: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
5550: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
5560: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
5570: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
5580: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
5590: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
55a0: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
55b0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
55c0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
55d0: 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30  ite3_io_trace==0
55e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
55f0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
5600: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
5610: 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70  [nOp-1];.  if( p
5620: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
5630: 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d  oop && pOp->p3!=
5640: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
5650: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 44 75 70   = sqlite3StrDup
5660: 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 69  (pOp->p3);.    i
5670: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
5680: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
5690: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
56a0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
56b0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
56c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
56d0: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
56e0: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
56f0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
5700: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
5710: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
5720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5740: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
5750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5760: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
5770: 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 28  qlite3_io_trace(
5780: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
5790: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
57a0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
57b0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
57c0: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
57d0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
57e0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  /.../*.** Prepar
57f0: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
5800: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
5810: 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  n.  This involve
5820: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
5830: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73   as allocating s
5840: 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69  tack space and i
5850: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
5860: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
5870: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
5880: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
5890: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
58a0: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
58b0: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
58c0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
58d0: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
58e0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
58f0: 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20   to move a VDBE 
5900: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
5910: 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  INIT to.** VDBE_
5920: 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f  MAGIC_RUN..*/.vo
5930: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
5940: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
5950: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
5960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5970: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
5980: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
5990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
59a0: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
59b0: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
59c0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ent */.  int nMe
59d0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
59e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
59f0: 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  r of memory cell
5a00: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
5a10: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20  .  int nCursor, 
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5a40: 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61  ursors to alloca
5a50: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78  te */.  int isEx
5a60: 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20  plain           
5a70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5a80: 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  f the EXPLAIN ke
5a90: 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e  ywords is presen
5aa0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  t */.){.  int n;
5ab0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
5ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
5ad0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5ae0: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
5af0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
5b00: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
5b10: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
5b20: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
5b30: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
5b40: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
5b50: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
5b60: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
5b70: 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65   This.   * is be
5b80: 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
5b90: 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28  o resizeOpArray(
5ba0: 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69  ) below may shri
5bb0: 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61  nk the.   * p->a
5bc0: 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61  Op[] array to sa
5bd0: 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c  ve memory if cal
5be0: 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45  led when in VDBE
5bf0: 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a  _MAGIC_RUN .   *
5c00: 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20   state..   */.  
5c10: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
5c20: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a  MAGIC_RUN;..  /*
5c30: 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   No instruction 
5c40: 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65  ever pushes more
5c50: 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65   than a single e
5c60: 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a  lement onto the.
5c70: 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64    ** stack.  And
5c80: 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72   the stack never
5c90: 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73   grows on succes
5ca0: 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20  sive executions 
5cb0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  of the.  ** same
5cc0: 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74   loop.  So the t
5cd0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
5ce0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61  nstructions is a
5cf0: 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20  n upper bound.  
5d00: 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75  ** on the maximu
5d10: 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20 72 65  m stack depth re
5d20: 71 75 69 72 65 64 2e 20 20 28 41 64 64 65 64 20  quired.  (Added 
5d30: 6c 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a  later:)  The.  *
5d40: 2a 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  * resolveP2Value
5d50: 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65  s() call compute
5d60: 73 20 61 20 74 69 67 68 74 65 72 20 75 70 70 65  s a tighter uppe
5d70: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20  r bound on the. 
5d80: 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a   ** stack size..
5d90: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    **.  ** Alloca
5da0: 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61  tion all the sta
5db0: 63 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c  ck space we will
5dc0: 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f   ever need..  */
5dd0: 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  .  if( p->aStack
5de0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
5df0: 41 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  Arg;       /* Ma
5e00: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
5e10: 61 72 67 73 20 70 61 73 73 65 64 20 74 6f 20 61  args passed to a
5e20: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20   user function. 
5e30: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63  */.    int nStac
5e40: 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75  k;     /* Maximu
5e50: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63  m number of stac
5e60: 6b 20 65 6e 74 72 69 65 73 20 72 65 71 75 69 72  k entries requir
5e70: 65 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76  ed */.    resolv
5e80: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
5e90: 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20  rg, &nStack);.  
5ea0: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
5eb0: 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  p, p->nOp);.    
5ec0: 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20  assert( nVar>=0 
5ed0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
5ee0: 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  Stack<p->nOp );.
5ef0: 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69      if( isExplai
5f00: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 61 63  n ){.      nStac
5f10: 6b 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  k = 10;.    }.  
5f20: 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71    p->aStack = sq
5f30: 6c 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20  liteMalloc(.    
5f40: 20 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a 65 6f      nStack*sizeo
5f50: 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20  f(p->aStack[0]) 
5f60: 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a     /* aStack */.
5f70: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
5f80: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
5f90: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
5fa0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
5fb0: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
5fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61            /* aVa
5fd0: 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  r */.      + nVa
5fe0: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  r*sizeof(char*) 
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6000: 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  zVar */.      + 
6010: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6030: 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  * aMem */.      
6040: 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  + nCursor*sizeof
6050: 28 43 75 72 73 6f 72 2a 29 20 20 20 20 20 20 20  (Cursor*)       
6060: 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20   /* apCsr */.   
6070: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   );.    if( !sql
6080: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
6090: 28 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  () ){.      p->a
60a0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Mem = &p->aStack
60b0: 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20  [nStack];.      
60c0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a  p->nMem = nMem;.
60d0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
60e0: 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a  &p->aMem[nMem];.
60f0: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
6100: 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  nVar;.      p->o
6110: 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  kVar = 0;.      
6120: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a  p->apArg = (Mem*
6130: 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d  *)&p->aVar[nVar]
6140: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
6150: 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61   = (char**)&p->a
6160: 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20  pArg[nArg];.    
6170: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75    p->apCsr = (Cu
6180: 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72  rsor**)&p->azVar
6190: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
61a0: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
61b0: 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  or;.      for(n=
61c0: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
61d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
61e0: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
61f0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Null;.      }.  
6200: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d    }.  }.  for(n=
6210: 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  0; n<p->nMem; n+
6220: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  +){.    p->aMem[
6230: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
6240: 75 6c 6c 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70  ull;.  }..  p->p
6250: 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Tos = &p->aStack
6260: 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20  [-1];.  p->pc = 
6270: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
6280: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e  LITE_OK;.  p->un
6290: 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70  iqueCnt = 0;.  p
62a0: 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20  ->returnDepth = 
62b0: 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  0;.  p->errorAct
62c0: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
62d0: 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20    p->popStack = 
62e0: 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e   0;.  p->explain
62f0: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
6300: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
6310: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
6320: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
6330: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
6340: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
6350: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
6360: 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65    p->openedState
6370: 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  ment = 0;.#ifdef
6380: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
6390: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
63a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
63b0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
63c0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
63d0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
63e0: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
63f0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6400: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
6410: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
6420: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
6430: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
6440: 72 20 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20  r happens.** to 
6450: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
6460: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
6470: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72  sor(Vdbe *p, Cur
6480: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
6490: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
64a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
64b0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
64c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
64d0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
64e0: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
64f0: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
6500: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
6510: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
6520: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
6530: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6540: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
6550: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
6560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
6570: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
6580: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
6590: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
65a0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
65b0: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
65c0: 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  Cx->pModule;.   
65d0: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
65e0: 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
65f0: 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62  3SafetyOff(p->db
6600: 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  );.    pModule->
6610: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
6620: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
6630: 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b  SafetyOn(p->db);
6640: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
6650: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
6660: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65  ndif.  sqliteFre
6670: 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pCx->pData);. 
6680: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d   sqliteFree(pCx-
6690: 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74  >aType);.  sqlit
66a0: 65 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f  eFree(pCx);.}../
66b0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
66c0: 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63  ursors.*/.static
66d0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
66e0: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
66f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
6700: 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74  ->apCsr==0 ) ret
6710: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
6720: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
6730: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
6740: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20  inVtabMethod || 
6750: 28 70 2d 3e 61 70 43 73 72 5b 69 5d 20 26 26 20  (p->apCsr[i] && 
6760: 21 70 2d 3e 61 70 43 73 72 5b 69 5d 2d 3e 70 56  !p->apCsr[i]->pV
6770: 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  tabCursor) ){.  
6780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
6790: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e  reeCursor(p, p->
67a0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20 20  apCsr[i]);.     
67b0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
67c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
67d0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
67e0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
67f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
6800: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
6810: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
6820: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
6830: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
6840: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
6850: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
6860: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
6870: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
6880: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
6890: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
68a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
68b0: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
68c0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
68d0: 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72  >aStack ){.    r
68e0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
68f0: 2d 3e 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70  ->aStack, 1 + (p
6900: 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61  ->pTos - p->aSta
6910: 63 6b 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f  ck));.    p->pTo
6920: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d  s = &p->aStack[-
6930: 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  1];.  }.  closeA
6940: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
6950: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6960: 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
6970: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6980: 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46  FifoClear(&p->sF
6990: 69 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63  ifo);.  if( p->c
69a0: 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20  ontextStack ){. 
69b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
69c0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
69d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
69e0: 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65  lite3VdbeFifoCle
69f0: 61 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ar(&p->contextSt
6a00: 61 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20  ack[i].sFifo);. 
6a10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
6a20: 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ree(p->contextSt
6a30: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ack);.  }.  p->c
6a40: 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b  ontextStack = 0;
6a50: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
6a60: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  ckDepth = 0;.  p
6a70: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
6a80: 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46  p = 0;.  sqliteF
6a90: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
6aa0: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
6ab0: 30 3b 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61  0;.  p->resOnSta
6ac0: 63 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck = 0;.}../*.**
6ad0: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
6ae0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
6af0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
6b00: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6b10: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
6b20: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
6b30: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
6b40: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
6b50: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
6b60: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
6b70: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
6b80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
6b90: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
6ba0: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
6bb0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
6bc0: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
6bd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6be0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
6bf0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
6c00: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
6c10: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
6c20: 20 6e 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   n;.  releaseMem
6c30: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
6c40: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
6c50: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
6c60: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f  qliteFree(p->aCo
6c70: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
6c80: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
6c90: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
6ca0: 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e  umn = nResColumn
6cb0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
6cc0: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
6cd0: 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  m*)sqliteMalloc(
6ce0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
6cf0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
6d00: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6d10: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
6d20: 30 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61  0 ){.    (pColNa
6d30: 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d  me++)->flags = M
6d40: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a  EM_Null;.  }.}..
6d50: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
6d60: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
6d70: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
6d80: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
6d90: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
6da0: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
6db0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
6dc0: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
6dd0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
6de0: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
6df0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
6e00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
6e10: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
6e20: 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20  If N==P3_STATIC 
6e30: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a   it means that z
6e40: 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Name is a pointe
6e50: 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20  r to a constant 
6e60: 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67  static.** string
6e70: 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74   and we can just
6e80: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
6e90: 72 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44  r. If it is P3_D
6ea0: 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a  YNAMIC, then .**
6eb0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66   the string is f
6ec0: 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
6ed0: 65 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  eFree() when the
6ee0: 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65   vdbe is finishe
6ef0: 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74  d with.** it. Ot
6f00: 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73  herwise, N bytes
6f10: 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f   of zName are co
6f20: 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pied..*/.int sql
6f30: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6f40: 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  me(Vdbe *p, int 
6f50: 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f  idx, int var, co
6f60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6f70: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72   int N){.  int r
6f80: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
6f90: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
6fa0: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
6fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
6fc0: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
6fd0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
6fe0: 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
6ff0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
7000: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
7010: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
7020: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
7030: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
7040: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
7050: 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e  .  if( N==P3_DYN
7060: 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54  AMIC || N==P3_ST
7070: 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  ATIC ){.    rc =
7080: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
7090: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
70a0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
70b0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
70c0: 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
70d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
70e0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
70f0: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
7100: 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53  N, SQLITE_UTF8,S
7110: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
7120: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
7130: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d  SQLITE_OK && N==
7140: 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P3_DYNAMIC ){.  
7150: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
7160: 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66  s = (pColName->f
7170: 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69  lags&(~MEM_Stati
7180: 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  c))|MEM_Dyn;.   
7190: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20   pColName->xDel 
71a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
71b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
71c0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
71d0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
71e0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
71f0: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
7200: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
7210: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7220: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
7230: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
7240: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
7250: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
7260: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
7270: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
7280: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
7290: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
72a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
72b0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
72c0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
72d0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
72e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
72f0: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
7300: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
7310: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
7320: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
7330: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
7340: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
7350: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
7360: 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65   0;..  /* Before
7370: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
7380: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
7390: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
73a0: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
73b0: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
73c0: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
73d0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
73e0: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
73f0: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
7400: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
7410: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
7420: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
7430: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
7440: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
7450: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
7460: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
7470: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
7480: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
7490: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
74a0: 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20  bSync(db, rc);. 
74b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
74c0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
74d0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
74e0: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
74f0: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
7500: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
7510: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
7520: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
7530: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
7540: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
7550: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
7560: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
7570: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
7580: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
7590: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
75a0: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
75b0: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
75c0: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
75d0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
75e0: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
75f0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
7600: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7610: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
7620: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
7630: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
7640: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
7650: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7660: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
7670: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
7680: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
7690: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
76a0: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
76b0: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
76c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
76d0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
76e0: 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
76f0: 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
7700: 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
7710: 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
7720: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
7730: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
7740: 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
7750: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
7760: 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
7770: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
7780: 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
7790: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
77a0: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
77b0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
77c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
77d0: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
77e0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
77f0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
7800: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
7810: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
7820: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
7830: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
7840: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
7850: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
7860: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
7870: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
7880: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
7890: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
78a0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
78b0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
78c0: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
78d0: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
78e0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
78f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
7900: 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20  mory:.  In that 
7910: 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20  case we do.  ** 
7920: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
7930: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
7940: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
7950: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  e simple case th
7960: 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a  en.  ** too..  *
7970: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65  /.  if( 0==strle
7980: 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n(sqlite3BtreeGe
7990: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
79a0: 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54  b[0].pBt)) || nT
79b0: 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66  rans<=1 ){.    f
79c0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
79d0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
79e0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
79f0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
7a00: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7a10: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
7a20: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7a30: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
7a40: 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
7a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
7a60: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
7a70: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
7a80: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
7a90: 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
7aa0: 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
7ab0: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
7ac0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
7ad0: 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
7ae0: 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
7af0: 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
7b00: 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
7b10: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
7b20: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
7b30: 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
7b40: 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
7b50: 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
7b60: 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
7b70: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
7b80: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
7b90: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
7ba0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
7bb0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
7bc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
7bd0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
7be0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
7bf0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
7c00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
7c10: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
7c20: 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  o(pBt);.      }.
7c30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7c40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7c50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
7c60: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
7c70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
7c80: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
7c90: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
7ca0: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
7cb0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
7cc0: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
7cd0: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
7ce0: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
7cf0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
7d00: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
7d10: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
7d20: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7d30: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
7d40: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 65  else{.    int ne
7d50: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
7d60: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
7d70: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
7d80: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
7d90: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
7da0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
7db0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
7dc0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
7dd0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
7de0: 0a 20 20 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73  .    OsFile *mas
7df0: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ter = 0;..    /*
7e00: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
7e10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
7e20: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
7e30: 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b       u32 random;
7e40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7e50: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7e60: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
7e70: 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ess(sizeof(rando
7e80: 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20  m), &random);.  
7e90: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
7ea0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73  lite3MPrintf("%s
7eb0: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
7ec0: 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66  ile, random&0x7f
7ed0: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
7ee0: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
7ef0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
7f00: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7f10: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
7f20: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
7f30: 73 74 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a  sts(zMaster) );.
7f40: 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
7f50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
7f60: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
7f70: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
7f80: 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  ive(zMaster, &ma
7f90: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  ster, 0);.    if
7fa0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7fb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
7fc0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
7fd0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7fe0: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
7ff0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
8000: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
8010: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
8020: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
8030: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
8040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
8050: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8060: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
8070: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
8080: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
8090: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
80a0: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
80b0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
80c0: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
80d0: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
80e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
80f0: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
8100: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
8110: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
8120: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
8130: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
8140: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
8150: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
8160: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
8170: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
8180: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
8190: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
81a0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
81b0: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
81c0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26        if( pBt &&
81d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
81e0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
81f0: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
8200: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
8210: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
8220: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
8230: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d      if( zFile[0]
8240: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==0 ) continue; 
8250: 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f   /* Ignore :memo
8260: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
8270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
8280: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
8290: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
82a0: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
82b0: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
82c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
82d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
82e0: 65 33 4f 73 57 72 69 74 65 28 6d 61 73 74 65 72  e3OsWrite(master
82f0: 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28  , zFile, strlen(
8300: 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20  zFile)+1);.     
8310: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8320: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8330: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8340: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
8350: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
8360: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  lete(zMaster);. 
8370: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
8380: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8390: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
83a0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
83b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20     }.    }...   
83c0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
83d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
83e0: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74  . Before doing t
83f0: 68 69 73 2c 20 6f 70 65 6e 20 74 68 65 20 64 69  his, open the di
8400: 72 65 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74  rectory.    ** t
8410: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8420: 6c 20 66 69 6c 65 20 69 73 20 73 74 6f 72 65 20  l file is store 
8430: 69 6e 20 73 6f 20 74 68 61 74 20 69 74 20 67 65  in so that it ge
8440: 74 73 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20  ts synced too.. 
8450: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46     */.    zMainF
8460: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
8470: 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d  eeGetDirname(db-
8480: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
8490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
84a0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 6d 61  OpenDirectory(ma
84b0: 73 74 65 72 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  ster, zMainFile)
84c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
84d0: 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
84e0: 20 20 20 20 20 28 6e 65 65 64 53 79 6e 63 20 26       (needSync &
84f0: 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53  & (rc=sqlite3OsS
8500: 79 6e 63 28 6d 61 73 74 65 72 2c 30 29 29 21 3d  ync(master,0))!=
8510: 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
8520: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8530: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20  se(&master);.   
8540: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
8550: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  te(zMaster);.   
8560: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
8570: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
8580: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
8590: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
85a0: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
85b0: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
85c0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
85d0: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
85e0: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
85f0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
8600: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
8610: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
8620: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
8630: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
8640: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
8650: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8660: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
8670: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
8680: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
8690: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
86a0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
86b0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
86c0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
86d0: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
86e0: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
86f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
8700: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
8710: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
8720: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
8730: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
8740: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
8750: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
8760: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8770: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
8780: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
8790: 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  occured..    */.
87a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
87b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
87c0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
87d0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
87e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
87f0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
8800: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
8810: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
8820: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8830: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
8840: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
8850: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
8860: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8870: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65  e3OsClose(&maste
8880: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
8890: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
88a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
88b0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
88c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
88d0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
88e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
88f0: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
8900: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
8910: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
8920: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
8930: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
8940: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
8950: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
8960: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
8970: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
8980: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
8990: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
89a0: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
89b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
89c0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
89d0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
89e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
89f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8a00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8a10: 4f 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28  OsSyncDirectory(
8a20: 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
8a30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8a40: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  K ){.      /* Th
8a50: 69 73 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e 20  is is not good. 
8a60: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
8a70: 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
8a80: 20 64 65 6c 65 74 65 64 2c 20 62 75 74 0a 20 20   deleted, but.  
8a90: 20 20 20 20 2a 2a 20 74 68 65 20 64 69 72 65 63      ** the direc
8aa0: 74 6f 72 79 20 73 79 6e 63 20 66 61 69 6c 65 64  tory sync failed
8ab0: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  . There is no co
8ac0: 6d 70 6c 65 74 65 6c 79 20 73 61 66 65 20 63 6f  mpletely safe co
8ad0: 75 72 73 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  urse of.      **
8ae0: 20 61 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65 72   action from her
8af0: 65 2e 20 54 68 65 20 69 6e 64 69 76 69 64 75 61  e. The individua
8b00: 6c 20 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74 61  l journals conta
8b10: 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  in the name of t
8b20: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74  he.      ** mast
8b30: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
8b40: 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   but there is no
8b50: 20 77 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20   way of knowing 
8b60: 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  if that.      **
8b70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8b80: 65 78 69 73 74 73 20 6e 6f 77 20 6f 72 20 69 66  exists now or if
8b90: 20 69 74 20 77 69 6c 6c 20 65 78 69 73 74 20 61   it will exist a
8ba0: 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
8bb0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 73 79 73 74  ng.      ** syst
8bc0: 65 6d 20 63 72 61 73 68 20 74 68 61 74 20 6d 61  em crash that ma
8bd0: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73 79  y follow the fsy
8be0: 6e 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  nc() failure..  
8bf0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
8c00: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
8c10: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
8c20: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
8c30: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
8c40: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
8c50: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
8c60: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
8c70: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8c80: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
8c90: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
8ca0: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
8cb0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
8cc0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
8cd0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
8ce0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
8cf0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
8d00: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
8d10: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
8d20: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
8d30: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
8d40: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
8d50: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
8d60: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
8d70: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
8d80: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
8d90: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
8da0: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
8db0: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
8dc0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
8dd0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
8de0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 66 6f 72 28  rors();.    for(
8df0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
8e00: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
8e10: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8e20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
8e30: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
8e40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
8e50: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
8e60: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8e70: 7d 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  }.    enable_sim
8e80: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
8e90: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
8ea0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
8eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
8ec0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
8ed0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8ee0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
8ef0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
8f00: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
8f10: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
8f20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
8f30: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
8f40: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
8f50: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
8f60: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
8f70: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
8f80: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
8f90: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
8fa0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
8fb0: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
8fc0: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
8fd0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
8fe0: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
8ff0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
9000: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
9010: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
9020: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
9030: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
9040: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
9050: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9060: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
9070: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  cnt = 0;.  p = d
9080: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
9090: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
90a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
90b0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
90c0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
90d0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t++;.    }.    p
90e0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
90f0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
9100: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
9110: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
9120: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
9130: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
9140: 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76  f../*.** Find ev
9150: 65 72 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74  ery active VM ot
9160: 68 65 72 20 74 68 61 6e 20 70 56 64 62 65 20 61  her than pVdbe a
9170: 6e 64 20 63 68 61 6e 67 65 20 69 74 73 20 73 74  nd change its st
9180: 61 74 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74  atus to.** abort
9190: 65 64 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ed.  This happen
91a0: 73 20 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61  s when one VM ca
91b0: 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
91c0: 64 75 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20  due to an.** ON 
91d0: 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43  CONFLICT ROLLBAC
91e0: 4b 20 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78  K clause (for ex
91f0: 61 6d 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68  ample).  The oth
9200: 65 72 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a  er VMs must be.*
9210: 2a 20 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61  * aborted so tha
9220: 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61  t they do not ha
9230: 76 65 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f  ve data rolled o
9240: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61  ut from undernea
9250: 74 68 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69  th.** them leadi
9260: 6e 67 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ng to a segfault
9270: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9280: 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76  3AbortOtherActiv
9290: 65 56 64 62 65 73 28 73 71 6c 69 74 65 33 20 2a  eVdbes(sqlite3 *
92a0: 64 62 2c 20 56 64 62 65 20 2a 70 45 78 63 65 70  db, Vdbe *pExcep
92b0: 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68  t){.  Vdbe *pOth
92c0: 65 72 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72  er;.  for(pOther
92d0: 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68  =db->pVdbe; pOth
92e0: 65 72 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65  er; pOther=pOthe
92f0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
9300: 66 28 20 70 4f 74 68 65 72 3d 3d 70 45 78 63 65  f( pOther==pExce
9310: 70 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pt ) continue;. 
9320: 20 20 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d     if( pOther->m
9330: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
9340: 5f 52 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e  _RUN || pOther->
9350: 70 63 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  pc<0 ) continue;
9360: 0a 20 20 20 20 63 68 65 63 6b 41 63 74 69 76 65  .    checkActive
9370: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20  VdbeCnt(db);.   
9380: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
9390: 28 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 63 68  (pOther);.    ch
93a0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
93b0: 28 64 62 29 3b 0a 20 20 20 20 70 4f 74 68 65 72  (db);.    pOther
93c0: 2d 3e 61 62 6f 72 74 65 64 20 3d 20 31 3b 0a 20  ->aborted = 1;. 
93d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
93e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
93f0: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
9400: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
9410: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
9420: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
9430: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
9440: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
9450: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
9460: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
9470: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
9480: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
9490: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
94a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
94b0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
94c0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
94d0: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
94e0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
94f0: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
9500: 43 5f 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65  C_HALT..**.** Re
9510: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
9520: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
9530: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
9540: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
9550: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
9560: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
9570: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
9580: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
9590: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
95a0: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
95b0: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
95c0: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
95d0: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
95e0: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
95f0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
9600: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
9610: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46  nt i;.  int (*xF
9620: 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29  unc)(Btree *pBt)
9630: 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69   = 0;  /* Functi
9640: 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61  on to call on ea
9650: 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64  ch btree backend
9660: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63   */.  int isSpec
9670: 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
9680: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
9690: 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f  rue if SQLITE_NO
96a0: 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a  MEM or IOERR */.
96b0: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
96c0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
96d0: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
96e0: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
96f0: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
9700: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
9710: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
9720: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
9730: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
9740: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
9750: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
9760: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
9770: 20 53 70 65 63 69 61 6c 20 65 72 72 6f 72 73 3a   Special errors:
9780: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49  .  **.  **     I
9790: 66 20 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  f an SQLITE_NOME
97a0: 4d 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  M error has occu
97b0: 72 65 64 20 69 6e 20 61 20 73 74 61 74 65 6d 65  red in a stateme
97c0: 6e 74 20 74 68 61 74 20 77 72 69 74 65 73 20 74  nt that writes t
97d0: 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 64  o.  **     the d
97e0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 65 69  atabase, then ei
97f0: 74 68 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74  ther a statement
9800: 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
9810: 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 0a 20  must be rolled. 
9820: 20 2a 2a 20 20 20 20 20 62 61 63 6b 20 74 6f 20   **     back to 
9830: 65 6e 73 75 72 65 20 74 68 65 20 74 72 65 65 2d  ensure the tree-
9840: 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20 69  structures are i
9850: 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  n a consistent s
9860: 74 61 74 65 2e 20 41 0a 20 20 2a 2a 20 20 20 20  tate. A.  **    
9870: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
9880: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
9890: 20 62 61 63 6b 20 69 66 20 6f 6e 65 20 69 73 20   back if one is 
98a0: 6f 70 65 6e 2c 20 6f 74 68 65 72 77 69 73 65 20  open, otherwise 
98b0: 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 65 6e 74  the.  **     ent
98c0: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
98d0: 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
98e0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ack..  **.  **  
98f0: 20 20 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f     If an SQLITE_
9900: 49 4f 45 52 52 20 65 72 72 6f 72 20 68 61 73 20  IOERR error has 
9910: 6f 63 63 75 72 65 64 20 69 6e 20 61 20 73 74 61  occured in a sta
9920: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 72 69 74  tement that writ
9930: 65 73 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 74  es to.  **     t
9940: 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
9950: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  n the entire tra
9960: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
9970: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
9980: 65 0a 20 20 2a 2a 20 20 20 20 20 49 2f 4f 20 65  e.  **     I/O e
9990: 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 63 61  rror may have ca
99a0: 75 73 65 64 20 67 61 72 62 61 67 65 20 74 6f 20  used garbage to 
99b0: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
99c0: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
99d0: 20 20 20 20 66 69 6c 65 2e 20 57 65 72 65 20 74      file. Were t
99e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
99f0: 6f 20 63 6f 6e 74 69 6e 75 65 20 61 6e 64 20 65  o continue and e
9a00: 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 72 6f 6c  ventually be rol
9a10: 6c 65 64 20 0a 20 20 2a 2a 20 20 20 20 20 62 61  led .  **     ba
9a20: 63 6b 20 74 68 61 74 20 67 61 72 62 61 67 65 20  ck that garbage 
9a30: 6d 69 67 68 74 20 65 6e 64 20 75 70 20 69 6e 20  might end up in 
9a40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9a50: 65 2e 0a 20 20 2a 2a 20 20 20 20 20 0a 20 20 2a  e..  **     .  *
9a60: 2a 20 20 20 20 20 49 6e 20 62 6f 74 68 20 6f 66  *     In both of
9a70: 20 74 68 65 20 61 62 6f 76 65 20 63 61 73 65 73   the above cases
9a80: 2c 20 74 68 65 20 56 64 62 65 2e 65 72 72 6f 72  , the Vdbe.error
9a90: 41 63 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20  Action variable 
9aa0: 69 73 20 0a 20 20 2a 2a 20 20 20 20 20 69 67 6e  is .  **     ign
9ab0: 6f 72 65 64 2e 20 49 66 20 74 68 65 20 73 71 6c  ored. If the sql
9ac0: 69 74 65 33 2e 61 75 74 6f 43 6f 6d 6d 69 74 20  ite3.autoCommit 
9ad0: 66 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e  flag is false an
9ae0: 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  d a transaction.
9af0: 20 20 2a 2a 20 20 20 20 20 69 73 20 72 6f 6c 6c    **     is roll
9b00: 65 64 20 62 61 63 6b 2c 20 69 74 20 77 69 6c 6c  ed back, it will
9b10: 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
9b20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72  .  **.  ** Other
9b30: 20 65 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20   errors:.  **.  
9b40: 2a 2a 20 4e 6f 20 65 72 72 6f 72 3a 0a 20 20 2a  ** No error:.  *
9b50: 2a 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  *.  */..  if( sq
9b60: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
9b70: 64 28 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  d() ){.    p->rc
9b80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9b90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61  .  }.  if( p->ma
9ba0: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
9bb0: 52 55 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  RUN ){.    /* Al
9bc0: 72 65 61 64 79 20 68 61 6c 74 65 64 2e 20 20 4e  ready halted.  N
9bd0: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 2a 2f  othing to do. */
9be0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9bf0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
9c00: 43 5f 48 41 4c 54 20 29 3b 0a 23 69 66 6e 64 65  C_HALT );.#ifnde
9c10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9c20: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
9c30: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
9c40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
9c50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9c60: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
9c70: 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63  rsors(p);.  chec
9c80: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
9c90: 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
9ca0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
9cb0: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
9cc0: 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
9cd0: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
9ce0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  pc>=0 ){.    int
9cf0: 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
9d00: 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
9d10: 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
9d20: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
9d30: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
9d40: 65 72 72 6f 72 73 20 2d 20 53 51 4c 49 54 45 5f  errors - SQLITE_
9d50: 4e 4f 4d 45 4d 20 6f 72 20 53 51 4c 49 54 45 5f  NOMEM or SQLITE_
9d60: 49 4f 45 52 52 20 2a 2f 0a 20 20 20 20 6d 72 63  IOERR */.    mrc
9d70: 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
9d80: 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
9d90: 72 6f 72 20 3d 20 28 0a 20 20 20 20 20 20 20 20  ror = (.        
9da0: 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
9db0: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
9dc0: 45 5f 49 4f 45 52 52 20 7c 7c 20 6d 72 63 3d 3d  E_IOERR || mrc==
9dd0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
9de0: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 69 66 28 20  )?1:0);.    if( 
9df0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
9e00: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
9e10: 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63  loop does static
9e20: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65   analysis of the
9e30: 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77 68   query to see wh
9e40: 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ich of the.     
9e50: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
9e60: 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20 69  ree categories i
9e70: 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20  t falls into:.  
9e80: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9e90: 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20      Read-only.  
9ea0: 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79      **     Query
9eb0: 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20   with statement 
9ec0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
9ed0: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 6f       Query witho
9ee0: 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ut statement jou
9ef0: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rnal.      **.  
9f00: 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20      ** We could 
9f10: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72  do something mor
9f20: 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74  e elegant than t
9f30: 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  his static analy
9f40: 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20  sis (i.e..      
9f50: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79 70  ** store the typ
9f60: 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70 61  e of query as pa
9f70: 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69  rt of the compli
9f80: 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75  ation phase), bu
9f90: 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  t .      ** hand
9fa0: 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  ling malloc() or
9fb0: 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61   IO failure is a
9fc0: 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
9fd0: 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20  edge case so .  
9fe0: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70      ** this is p
9ff0: 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20  robably easier. 
a000: 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61  Todo: Might be a
a010: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
a020: 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a   reduce .      *
a030: 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65  * code size a ve
a040: 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20  ry small amount 
a050: 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20  though....      
a060: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 52  */.      int isR
a070: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
a080: 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65     int isStateme
a090: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  nt = 0;.      as
a0a0: 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70  sert(p->aOp || p
a0b0: 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20  ->nOp==0);.     
a0c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
a0d0: 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Op; i++){ .     
a0e0: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f     switch( p->aO
a0f0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20  p[i].opcode ){. 
a100: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50           case OP
a110: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20  _Transaction:.  
a120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
a130: 73 20 69 73 20 61 20 62 69 74 20 73 74 72 61 6e  s is a bit stran
a140: 67 65 2e 20 49 66 20 77 65 20 68 69 74 20 61 20  ge. If we hit a 
a150: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
a160: 72 72 6f 72 20 61 6e 64 0a 20 20 20 20 20 20 20  rror and.       
a170: 20 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74       ** the stat
a180: 65 6d 65 6e 74 20 64 69 64 20 6e 6f 74 20 6f 70  ement did not op
a190: 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
a1a0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 77 65 20 77  ransaction, we w
a1b0: 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ill.            
a1c0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  ** rollback any 
a1d0: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
a1e0: 6f 6e 20 61 6e 64 20 61 62 6f 72 74 20 61 6c 6c  on and abort all
a1f0: 20 6f 74 68 65 72 20 61 63 74 69 76 65 0a 20 20   other active.  
a200: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61            ** sta
a210: 74 65 6d 65 6e 74 73 2e 20 4f 72 2c 20 69 66 20  tements. Or, if 
a220: 74 68 69 73 20 69 73 20 61 6e 20 53 51 4c 49 54  this is an SQLIT
a230: 45 5f 49 4e 54 45 52 52 55 50 54 20 65 72 72 6f  E_INTERRUPT erro
a240: 72 2c 20 77 65 0a 20 20 20 20 20 20 20 20 20 20  r, we.          
a250: 20 20 2a 2a 20 77 69 6c 6c 20 6f 6e 6c 79 20 72    ** will only r
a260: 6f 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 69  ollback if the i
a270: 6e 74 65 72 72 75 70 74 65 64 20 73 74 61 74 65  nterrupted state
a280: 6d 65 6e 74 20 77 61 73 20 61 20 77 72 69 74 65  ment was a write
a290: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
a2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
a2b0: 49 74 20 63 6f 75 6c 64 20 62 65 20 61 72 67 75  It could be argu
a2c0: 65 64 20 74 68 61 74 20 72 65 61 64 2d 6f 6e 6c  ed that read-onl
a2d0: 79 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68 6f  y statements sho
a2e0: 75 6c 64 20 6e 65 76 65 72 0a 20 20 20 20 20 20  uld never.      
a2f0: 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
a300: 6b 20 61 6e 79 74 68 69 6e 67 2e 20 42 75 74 20  k anything. But 
a310: 63 61 72 65 66 75 6c 20 61 6e 61 6c 79 73 69 73  careful analysis
a320: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
a330: 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ore.            
a340: 2a 2a 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 63  ** making this c
a350: 68 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20  hange.          
a360: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
a370: 20 69 66 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70   if( p->aOp[i].p
a380: 32 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  2 || mrc!=SQLITE
a390: 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 52 65              isRe
a3b0: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
a3c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a3e0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53         case OP_S
a3f0: 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20  tatement:.      
a400: 20 20 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e        isStatemen
a410: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
a420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a430: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20    }.      }.  . 
a440: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
a450: 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
a460: 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e  ly, we need do n
a470: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c  o rollback at al
a480: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
a490: 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77      ** proceed w
a4a0: 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
a4b0: 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20  handling..      
a4c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
a4d0: 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  ReadOnly ){.    
a4e0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
a4f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
a500: 4b 45 44 20 26 26 20 69 73 53 74 61 74 65 6d 65  KED && isStateme
a510: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
a520: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
a530: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
a540: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
a550: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
a560: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
a570: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a580: 45 5f 4e 4f 4d 45 4d 20 26 26 20 69 73 53 74 61  E_NOMEM && isSta
a590: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
a5a0: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
a5b0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a5c0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
a5d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
a5e0: 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
a5f0: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
a600: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
a610: 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
a620: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
a630: 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
a640: 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
a650: 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
a660: 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
a670: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
a680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
a690: 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64  ortOtherActiveVd
a6a0: 62 65 73 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  bes(db, p);.    
a6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
a6c0: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
a6d0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
a6e0: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
a6f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a700: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
a710: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
a720: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
a730: 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
a740: 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74  y active vdbe, t
a750: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f  hen.    ** we do
a760: 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
a770: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
a780: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
a790: 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
a7a0: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
a7b0: 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
a7c0: 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
a7d0: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
a7e0: 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
a7f0: 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65  above has occure
a800: 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
a810: 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
a820: 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56  t && db->activeV
a830: 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  dbeCnt==1 ){.   
a840: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
a850: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
a860: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
a870: 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
a880: 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
a890: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
a8a0: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
a8b0: 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65  ue, and the vdbe
a8c0: 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20   program was .  
a8d0: 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73        ** success
a8e0: 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f  ful or hit an 'O
a8f0: 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
a900: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  nt. This means a
a910: 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
a920: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
a930: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a940: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62      int rc = vdb
a950: 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  eCommit(db);.   
a960: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
a970: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
a980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a990: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
a9a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
a9b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a9c0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
a9d0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
a9e0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
a9f0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  db);.        }el
aa00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
aa10: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
aa20: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
aa30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aa40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
aa50: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
aa60: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
aa70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46     }else if( !xF
aa80: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  unc ){.      if(
aa90: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
aaa0: 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
aab0: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
aac0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
aad0: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29  penedStatement )
aae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
aaf0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
ab00: 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20  CommitStmt;.    
ab10: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
ab20: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
ab30: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
ab40: 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63  ){.        xFunc
ab50: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
ab60: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
ab70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ab80: 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74    sqlite3AbortOt
ab90: 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28 64  herActiveVdbes(d
aba0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 73  b, p);.        s
abb0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
abc0: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  l(db);.        d
abd0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
abe0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
abf0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46  .  .    /* If xF
ac00: 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  unc is not NULL,
ac10: 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20   then it is one 
ac20: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  of sqlite3BtreeR
ac30: 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20  ollbackStmt or. 
ac40: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
ac50: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61  eeCommitStmt. Ca
ac60: 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61  ll it once on ea
ac70: 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61  ch backend. If a
ac80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  n error occurs. 
ac90: 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65     ** and the re
aca0: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69  turn code is sti
acb0: 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65  ll SQLITE_OK, se
acc0: 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
acd0: 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  e to the new.   
ace0: 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e   ** error value.
acf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
ad00: 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20  rt(!xFunc ||.   
ad10: 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65     xFunc==sqlite
ad20: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
ad30: 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d   ||.      xFunc=
ad40: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c  =sqlite3BtreeRol
ad50: 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b  lbackStmt.    );
ad60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46  .    for(i=0; xF
ad70: 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  unc && i<db->nDb
ad80: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
ad90: 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72  nt rc;.      Btr
ada0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
adb0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
adc0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
add0: 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42     rc = xFunc(pB
ade0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
adf0: 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51  rc && (p->rc==SQ
ae00: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
ae10: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
ae20: 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20  INT) ){.        
ae30: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
ae40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
ae50: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
ae60: 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  rMsg, 0);.      
ae70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ae80: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
ae90: 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
aea0: 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
aeb0: 45 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74  ETE and the stat
aec0: 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74  ement was commit
aed0: 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  ted, .    ** set
aee0: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
aef0: 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
af00: 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
af10: 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  tOn && p->pc>=0 
af20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46  ){.      if( !xF
af30: 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71  unc || xFunc==sq
af40: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
af50: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
af60: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
af70: 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
af80: 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
af90: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
afa0: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
afb0: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
afc0: 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
afd0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
afe0: 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  .    /* Rollback
aff0: 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73   or commit any s
b000: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68  chema changes th
b010: 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a  at occurred. */.
b020: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
b030: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e  QLITE_OK && db->
b040: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74  flags&SQLITE_Int
b050: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
b060: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
b070: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
b080: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d  b, 0);.      db-
b090: 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
b0a0: 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
b0b0: 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
b0c0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20   }.  }..  /* We 
b0d0: 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
b0e0: 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
b0f0: 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
b100: 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
b110: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
b120: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
b130: 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d  veVdbeCnt--;.  }
b140: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
b150: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
b160: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
b170: 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75  Cnt(db);..  retu
b180: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b190: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
b1a0: 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
b1b0: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
b1c0: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
b1d0: 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
b1e0: 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
b1f0: 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
b200: 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
b210: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
b220: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
b230: 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
b240: 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
b250: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b260: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
b270: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
b280: 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
b290: 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
b2a0: 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
b2b0: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
b2c0: 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
b2d0: 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
b2e0: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
b2f0: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
b300: 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
b310: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
b320: 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
b330: 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
b340: 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
b350: 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
b360: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
b370: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
b380: 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
b390: 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
b3a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
b3b0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
b3c0: 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
b3d0: 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
b3e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
b3f0: 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
b400: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
b410: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
b420: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
b430: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
b440: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
b450: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
b460: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
b470: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
b480: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
b490: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
b4a0: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
b4b0: 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  .  sqlite3Safety
b4c0: 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  On(db);.  sqlite
b4d0: 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20  3VdbeHalt(p);.  
b4e0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
b4f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  (db);..  /* If t
b500: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
b510: 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
b520: 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
b530: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
b540: 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
b550: 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
b560: 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
b570: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
b580: 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
b590: 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
b5a0: 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
b5b0: 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
b5c0: 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
b5d0: 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
b5e0: 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
b5f0: 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
b600: 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
b610: 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
b620: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
b630: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69  ->pc>=0 ){.    i
b640: 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  f( p->zErrMsg ){
b650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
b660: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
b670: 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
b680: 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
b690: 20 73 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a   sqlite3FreeX);.
b6a0: 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
b6b0: 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
b6c0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
b6d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b6e0: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
b6f0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
b700: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
b710: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b720: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b730: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
b740: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
b750: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
b760: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
b770: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
b780: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
b790: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b7a0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
b7b0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
b7c0: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
b7d0: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
b7e0: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
b7f0: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
b800: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
b810: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
b820: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
b830: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
b840: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
b850: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
b860: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
b870: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
b880: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
b890: 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
b8a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
b8b0: 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
b8c0: 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  un..  */.  asser
b8d0: 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61  t( p->pTos<&p->a
b8e0: 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a  Stack[p->pc<0?0:
b8f0: 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61 53  p->pc] || !p->aS
b900: 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20 56  tack );.#ifdef V
b910: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
b920: 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
b930: 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
b940: 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
b950: 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
b960: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b970: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
b980: 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
b990: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
b9a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b9b0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
b9c0: 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
b9d0: 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
b9e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
b9f0: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
ba00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
ba10: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
ba20: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
ba30: 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
ba40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
ba50: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
ba60: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
ba70: 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
ba80: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
ba90: 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
baa0: 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
bab0: 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
bac0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
bad0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
bae0: 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
baf0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
bb00: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
bb10: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
bb20: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
bb30: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
bb40: 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b   p->aborted = 0;
bb50: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
bb60: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
bb70: 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
bb80: 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
bb90: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
bba0: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
bbb0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
bbc0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
bbd0: 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
bbe0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
bbf0: 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
bc00: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
bc10: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
bc20: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
bc30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bc40: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
bc50: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
bc60: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bc70: 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
bc80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
bc90: 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
bca0: 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
bcb0: 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
bcc0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
bcd0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
bce0: 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20  AGIC_INIT ){.   
bcf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
bd00: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
bd10: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
bd20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bd30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  }../*.** Call th
bd40: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
bd50: 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e   each auxdata en
bd60: 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63  try in pVdbeFunc
bd70: 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68   for which.** th
bd80: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
bd90: 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63  bit in mask is c
bda0: 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65  lear.  Auxdata e
bdb0: 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31  ntries beyond 31
bdc0: 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64  .** are always d
bdd0: 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65  estroyed.  To de
bde0: 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74  stroy all auxdat
bdf0: 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20  a entries, call 
be00: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
be10: 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f  with mask==0..*/
be20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
be30: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
be40: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
be50: 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  nc, int mask){. 
be60: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
be70: 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e  0; i<pVdbeFunc->
be80: 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAux; i++){.    
be90: 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a  struct AuxData *
bea0: 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e  pAux = &pVdbeFun
beb0: 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20  c->apAux[i];.   
bec0: 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28   if( (i>31 || !(
bed0: 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26  mask&(1<<i))) &&
bee0: 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20   pAux->pAux ){. 
bef0: 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
bf00: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
bf10: 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
bf20: 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
bf30: 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d     }.      pAux-
bf40: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
bf50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
bf60: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
bf70: 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
bf80: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
bf90: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
bfa0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bfb0: 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70  eturn;.  Cleanup
bfc0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  (p);.  if( p->pP
bfd0: 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
bfe0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
bff0: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
c000: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
c010: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
c020: 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20     p->db->pVdbe 
c030: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
c040: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
c050: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
c060: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
c070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
c080: 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  Op ){.    for(i=
c090: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
c0a0: 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f 70  ){.      Op *pOp
c0b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
c0c0: 20 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d       freeP3(pOp-
c0d0: 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33  >p3type, pOp->p3
c0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
c0f0: 69 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b  iteFree(p->aOp);
c100: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
c110: 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
c120: 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69  p->nVar);.  sqli
c130: 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c  teFree(p->aLabel
c140: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
c150: 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65  p->aStack);.  re
c160: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
c170: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
c180: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
c190: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  _N);.  sqliteFre
c1a0: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
c1b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
c1c0: 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69  zSql);.  p->magi
c1d0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
c1e0: 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  EAD;.  sqliteFre
c1f0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(p);.}../*.** I
c200: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
c210: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
c220: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
c230: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
c240: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
c250: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
c260: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
c270: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
c280: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
c290: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
c2a0: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
c2b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
c2c0: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
c2d0: 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b  veto(Cursor *p){
c2e0: 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
c2f0: 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
c300: 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
c310: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
c320: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
c330: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
c340: 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
c350: 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
c360: 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
c370: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
c380: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
c390: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
c3a0: 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
c3b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c3c0: 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63  rc;.    *p->pInc
c3d0: 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rKey = 0;.    p-
c3e0: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79  >lastRowid = key
c3f0: 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54  ToInt(p->movetoT
c400: 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72  arget);.    p->r
c410: 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65  owidIsValid = re
c420: 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65  s==0;.    if( re
c430: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  s<0 ){.      rc 
c440: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
c450: 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  xt(p->pCursor, &
c460: 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
c470: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c480: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
c490: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
c4a0: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
c4b0: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
c4c0: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
c4d0: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
c4e0: 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
c4f0: 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72  E_STALE;.  }.  r
c500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
c520: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
c530: 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
c540: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
c550: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c560: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
c570: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
c580: 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c  ialRead().** sql
c590: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
c5a0: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
c5b0: 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a  beSerialWrite().
c5c0: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
c5d0: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
c5e0: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
c5f0: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
c600: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
c610: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
c620: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
c630: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
c640: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
c650: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
c660: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
c670: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
c680: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
c690: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
c6a0: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
c6b0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
c6c0: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
c6d0: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
c6e0: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
c6f0: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
c700: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
c710: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
c720: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
c730: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
c740: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
c750: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
c760: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
c770: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
c780: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
c790: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
c7a0: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
c7b0: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
c7c0: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
c7d0: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
c7e0: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
c7f0: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
c800: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
c810: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
c820: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
c830: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
c840: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
c850: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
c860: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
c870: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
c8a0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
c8b0: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
c8e0: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
c910: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
c920: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
c930: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
c940: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
c950: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
c980: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
c990: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
c9b0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
c9c0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
c9d0: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
c9e0: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
c9f0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
ca00: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
ca30: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
ca40: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
ca60: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
ca70: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
caa0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
cab0: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
cae0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
caf0: 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
cb20: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
cb30: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
cb40: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
cb50: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
cb60: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
cb70: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
cb80: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
cb90: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
cba0: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
cbb0: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
cbc0: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
cbd0: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
cbe0: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
cbf0: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
cc00: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
cc10: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
cc20: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
cc30: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
cc40: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
cc50: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
cc60: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
cc70: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
cc80: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
cc90: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
cca0: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
ccb0: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
ccc0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
ccd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
cce0: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
ccf0: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
cd00: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
cd10: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
cd20: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
cd30: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
cd40: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
cd50: 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  1000)<<32)-1).  
cd60: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
cd70: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
cd80: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
cd90: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
cda0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
cdb0: 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20  rn 8+i;.    }.  
cdc0: 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a    u = i<0 ? -i :
cdd0: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
cde0: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
cdf0: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
ce00: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
ce10: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
ce20: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
ce30: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
ce40: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
ce50: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
ce60: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
ce70: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
ce80: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
ce90: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
cea0: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
ceb0: 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53  rt( flags&(MEM_S
cec0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
ced0: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
cee0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
cef0: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
cf00: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d  = pMem->u.i;.  }
cf10: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
cf20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
cf30: 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
cf40: 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
cf50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cf60: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
cf70: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
cf80: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
cf90: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
cfa0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
cfb0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
cfc0: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
cfd0: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
cfe0: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
cff0: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
d000: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
d010: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
d020: 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
d030: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
d040: 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
d050: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
d060: 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
d070: 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
d080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
d090: 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
d0a0: 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
d0b0: 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
d0c0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
d0d0: 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
d0e0: 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
d0f0: 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
d100: 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
d110: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
d120: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
d130: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
d140: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
d150: 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
d160: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
d170: 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
d180: 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
d190: 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
d1a0: 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
d1b0: 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
d1c0: 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
d1d0: 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
d1e0: 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
d1f0: 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
d200: 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
d210: 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
d220: 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
d230: 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
d240: 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
d250: 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
d260: 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
d270: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
d280: 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
d290: 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
d2a0: 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
d2b0: 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
d2c0: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
d2d0: 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
d2e0: 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
d2f0: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
d300: 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
d310: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
d320: 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
d330: 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
d340: 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
d350: 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
d360: 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
d370: 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
d380: 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
d390: 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
d3a0: 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
d3b0: 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
d3c0: 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
d3d0: 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
d3e0: 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
d3f0: 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
d400: 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
d410: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
d420: 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 23  is correct..*/.#
d430: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
d440: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
d450: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 64 6f 75  FLOAT.static dou
d460: 62 6c 65 20 66 6c 6f 61 74 53 77 61 70 28 64 6f  ble floatSwap(do
d470: 75 62 6c 65 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  uble in){.  unio
d480: 6e 20 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  n {.    double r
d490: 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
d4a0: 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
d4b0: 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
d4c0: 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
d4d0: 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
d4e0: 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
d4f0: 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
d500: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
d510: 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
d520: 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
d530: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
d540: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
d550: 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
d560: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
d570: 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
d580: 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
d590: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
d5a0: 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
d5b0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
d5c0: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
d5d0: 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
d5e0: 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
d5f0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
d600: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
d610: 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
d620: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
d630: 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
d640: 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
d650: 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
d660: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
d670: 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
d680: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
d690: 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
d6a0: 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
d6b0: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
d6c0: 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
d6d0: 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
d6e0: 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
d6f0: 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
d700: 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
d710: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
d720: 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
d730: 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
d740: 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
d750: 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
d760: 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
d770: 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
d780: 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
d790: 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
d7a0: 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
d7b0: 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
d7c0: 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
d7d0: 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
d7e0: 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
d7f0: 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
d800: 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
d810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
d820: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
d830: 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
d840: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
d850: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
d860: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
d870: 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
d880: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
d890: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
d8a0: 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
d8b0: 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
d8c0: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
d8d0: 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
d8e0: 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
d8f0: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
d900: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
d910: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
d920: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d930: 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
d940: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20  _format);.  int 
d950: 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
d960: 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
d970: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
d980: 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
d990: 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
d9a0: 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  v;.    int i;.  
d9b0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
d9c0: 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
d9d0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
d9e0: 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
d9f0: 20 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69   );.      swapMi
da00: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 70  xedEndianFloat(p
da10: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 6d  Mem->r);.      m
da20: 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
da30: 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
da40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da50: 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
da60: 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
da70: 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
da80: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
da90: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
daa0: 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66  ssert( len<=nBuf
dab0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   );.    while( i
dac0: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b  -- ){.      buf[
dad0: 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20  i] = (v&0xFF);. 
dae0: 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
daf0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
db00: 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
db10: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
db20: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
db30: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
db40: 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
db50: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
db60: 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
db70: 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  .i:0).          
db80: 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62     == sqlite3Vdb
db90: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
dba0: 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
dbb0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
dbc0: 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
dbd0: 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
dbe0: 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
dbf0: 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
dc00: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
dc10: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
dc20: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
dc30: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66  m->u.i;.      if
dc40: 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20  ( len>nBuf ){.  
dc50: 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66        len = nBuf
dc60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dc70: 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
dc80: 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
dc90: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
dca0: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
dcb0: 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
dcc0: 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
dcd0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
dce0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
dcf0: 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
dd00: 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
dd10: 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
dd20: 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
dd30: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
dd40: 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
dd50: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
dd60: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
dd70: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
dd80: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
dd90: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
dda0: 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
ddb0: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
ddc0: 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
ddd0: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
dde0: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
ddf0: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
de00: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
de10: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
de40: 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
de50: 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
de60: 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
de70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
de80: 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
de90: 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
dea0: 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
deb0: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
dec0: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
ded0: 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
dee0: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
def0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
df00: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
df10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
df20: 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
df30: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
df40: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
df50: 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
df60: 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
df70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
df80: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
df90: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
dfa0: 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
dfb0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
dfc0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
dfd0: 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
dfe0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
dff0: 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
e000: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e010: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e020: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
e030: 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
e040: 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
e050: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
e060: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
e070: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
e080: 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
e090: 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
e0a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
e0b0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e0c0: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
e0d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
e0e0: 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
e0f0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
e100: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
e110: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
e120: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
e130: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
e140: 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
e150: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
e160: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
e170: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e180: 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
e190: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
e1a0: 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
e1b0: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
e1c0: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
e1d0: 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
e1e0: 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
e1f0: 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
e200: 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
e210: 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
e220: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
e230: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
e240: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
e250: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e260: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
e270: 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
e280: 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
e290: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
e2a0: 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
e2b0: 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
e2c0: 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
e2d0: 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
e2e0: 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
e2f0: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
e300: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e310: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
e320: 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
e330: 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
e340: 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
e350: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
e360: 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
e370: 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
e380: 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
e390: 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
e3a0: 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
e3b0: 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
e3c0: 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
e3d0: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
e3e0: 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
e3f0: 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
e400: 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
e410: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e420: 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
e430: 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
e440: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e450: 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
e460: 31 2e 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  1.0;.      doubl
e470: 65 20 72 32 20 3d 20 72 31 3b 0a 20 20 20 20 20  e r2 = r1;.     
e480: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
e490: 46 6c 6f 61 74 28 72 32 29 3b 0a 20 20 20 20 20  Float(r2);.     
e4a0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e4b0: 72 32 29 3d 3d 73 69 7a 65 6f 66 28 74 31 29 20  r2)==sizeof(t1) 
e4c0: 26 26 20 6d 65 6d 63 6d 70 28 26 72 32 2c 20 26  && memcmp(&r2, &
e4d0: 74 31 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t1, sizeof(r1))=
e4e0: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
e4f0: 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c      x = (buf[0]<
e500: 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
e510: 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
e520: 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
e530: 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32    y = (buf[4]<<2
e540: 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36  4) | (buf[5]<<16
e550: 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20  ) | (buf[6]<<8) 
e560: 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20  | buf[7];.      
e570: 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
e580: 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
e590: 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
e5a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e5b0: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
e5c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e5d0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e5e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e5f0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
e600: 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
e610: 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20  Mem->r)==8 );.  
e620: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d        memcpy(&pM
e630: 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
e640: 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73  f(x));.        s
e650: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e660: 6f 61 74 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  oat(pMem->r);.  
e670: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e680: 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  s = MEM_Real;.  
e690: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
e6a0: 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 8;.    }.    
e6b0: 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
e6c0: 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
e6d0: 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
e6e0: 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
e6f0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
e700: 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
e710: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e720: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
e730: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
e740: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
e750: 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65     int len = (se
e760: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
e770: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
e780: 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
e790: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65      pMem->n = le
e7a0: 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78  n;.      pMem->x
e7b0: 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Del = 0;.      i
e7c0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30  f( serial_type&0
e7d0: 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  x01 ){.        p
e7e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e7f0: 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  _Str | MEM_Ephem
e800: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e810: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
e820: 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20  gs = MEM_Blob | 
e830: 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
e840: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
e850: 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  len;.    }.  }. 
e860: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e870: 0a 2a 2a 20 54 68 65 20 68 65 61 64 65 72 20 6f  .** The header o
e880: 66 20 61 20 72 65 63 6f 72 64 20 63 6f 6e 73 69  f a record consi
e890: 73 74 73 20 6f 66 20 61 20 73 65 71 75 65 6e 63  sts of a sequenc
e8a0: 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74  e variable-lengt
e8b0: 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54  h integers..** T
e8c0: 68 65 73 65 20 69 6e 74 65 67 65 72 73 20 61 72  hese integers ar
e8d0: 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  e almost always 
e8e0: 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e  small and are en
e8f0: 63 6f 64 65 64 20 61 73 20 61 20 73 69 6e 67 6c  coded as a singl
e900: 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66  e byte..** The f
e910: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74  ollowing macro t
e920: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 74  akes advantage t
e930: 68 69 73 20 66 61 63 74 20 74 6f 20 70 72 6f 76  his fact to prov
e940: 69 64 65 20 61 20 66 61 73 74 20 64 65 63 6f 64  ide a fast decod
e950: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65  e.** of the inte
e960: 67 65 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64  gers in a record
e970: 20 68 65 61 64 65 72 2e 20 20 49 74 20 69 73 20   header.  It is 
e980: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
e990: 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68  ommon case.** wh
e9a0: 65 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ere the integer 
e9b0: 69 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  is a single byte
e9c0: 2e 20 20 49 74 20 69 73 20 61 20 6c 69 74 74 6c  .  It is a littl
e9d0: 65 20 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 68  e slower when th
e9e0: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20  e.** integer is 
e9f0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65  two or more byte
ea00: 73 2e 20 20 42 75 74 20 6f 76 65 72 61 6c 6c 20  s.  But overall 
ea10: 69 74 20 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a  it is faster..**
ea20: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
ea30: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  g expressions ar
ea40: 65 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a  e equivalent:.**
ea50: 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69  .**     x = sqli
ea60: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 20  te3GetVarint32( 
ea70: 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20  A, &B );.**.**  
ea80: 20 20 20 78 20 3d 20 47 65 74 56 61 72 69 6e 74     x = GetVarint
ea90: 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a  ( A, B );.**.*/.
eaa0: 23 64 65 66 69 6e 65 20 47 65 74 56 61 72 69 6e  #define GetVarin
eab0: 74 28 41 2c 42 29 20 20 28 28 42 20 3d 20 2a 28  t(A,B)  ((B = *(
eac0: 41 29 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20  A))<=0x7f ? 1 : 
ead0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
eae0: 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a  32(A, &B))../*.*
eaf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eb00: 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
eb10: 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
eb20: 6e 64 65 78 20 72 65 63 6f 72 64 73 20 73 70 65  ndex records spe
eb30: 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e  cified by .** {n
eb40: 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
eb50: 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c   {nKey2, pKey2},
eb60: 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67   returning a neg
eb70: 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
eb80: 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
eb90: 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b  er if {nKey1, pK
eba0: 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61  ey1} is less tha
ebb0: 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
ebc0: 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
ebd0: 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20  {nKey2, pKey2}. 
ebe0: 20 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b   Both Key1 and K
ebf0: 65 79 32 20 6d 75 73 74 20 62 65 20 62 79 74 65  ey2 must be byte
ec00: 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70   strings.** comp
ec10: 6f 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  osed by the OP_M
ec20: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
ec30: 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f   of the VDBE..*/
ec40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
ec50: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
ec60: 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c   void *userData,
ec70: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
ec80: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
ec90: 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63   .  int nKey2, c
eca0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
ecb0: 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  .){.  KeyInfo *p
ecc0: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
ecd0: 66 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20  fo*)userData;.  
ece0: 75 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20  u32 d1, d2;     
ecf0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
ed00: 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
ed10: 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
ed20: 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69  */.  u32 idx1, i
ed30: 64 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66  dx2;      /* Off
ed40: 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
ed50: 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
ed60: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
ed70: 73 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20  szHdr1, szHdr2; 
ed80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
ed90: 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
eda0: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
edb0: 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e  int nField;.  in
edc0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
edd0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
ede0: 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
edf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
ee00: 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75  pKey1;.  const u
ee10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
ee20: 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey2 = (const uns
ee30: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
ee40: 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  y2;..  Mem mem1;
ee50: 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d  .  Mem mem2;.  m
ee60: 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
ee70: 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e  fo->enc;.  mem2.
ee80: 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
ee90: 65 6e 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d  enc;.  .  idx1 =
eea0: 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31   GetVarint(aKey1
eeb0: 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
eec0: 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32  = szHdr1;.  idx2
eed0: 20 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65   = GetVarint(aKe
eee0: 79 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64  y2, szHdr2);.  d
eef0: 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46  2 = szHdr2;.  nF
ef00: 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
ef10: 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65  >nField;.  while
ef20: 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
ef30: 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a   idx2<szHdr2 ){.
ef40: 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
ef50: 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65  ype1;.    u32 se
ef60: 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20  rial_type2;..   
ef70: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
ef80: 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
ef90: 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
efa0: 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
efb0: 20 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61     idx1 += GetVa
efc0: 72 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31  rint( aKey1+idx1
efd0: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
efe0: 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b  ;.    if( d1>=nK
eff0: 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey1 && sqlite3Vd
f000: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
f010: 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20  serial_type1)>0 
f020: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78  ) break;.    idx
f030: 32 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20  2 += GetVarint( 
f040: 61 4b 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69  aKey2+idx2, seri
f050: 61 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20  al_type2 );.    
f060: 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26  if( d2>=nKey2 &&
f070: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
f080: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
f090: 5f 74 79 70 65 32 29 3e 30 20 29 20 62 72 65 61  _type2)>0 ) brea
f0a0: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
f0b0: 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
f0c0: 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
f0d0: 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
f0e0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f0f0: 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
f100: 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
f110: 65 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20  em1);.    d2 += 
f120: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f130: 6c 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c  lGet(&aKey2[d2],
f140: 20 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26   serial_type2, &
f150: 6d 65 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem2);..    /* D
f160: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
f170: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
f180: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
f190: 72 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c  re(&mem1, &mem2,
f1a0: 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79   i<nField ? pKey
f1b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a  Info->aColl[i] :
f1c0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d   0);.    if( mem
f1d0: 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  1.flags & MEM_Dy
f1e0: 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  n ) sqlite3VdbeM
f1f0: 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
f200: 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e 66  ;.    if( mem2.f
f210: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
f220: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
f230: 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20  elease(&mem2);. 
f240: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
f250: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f260: 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a   }.    i++;.  }.
f270: 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  .  /* One of the
f280: 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
f290: 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c   fields, but all
f2a0: 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
f2b0: 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a  o that point.  *
f2c0: 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66  * were equal. If
f2d0: 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61   the incrKey fla
f2e0: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
f2f0: 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69  the second key i
f300: 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61  s.  ** treated a
f310: 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20  s larger..  */. 
f320: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
f330: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
f340: 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20  incrKey ){.     
f350: 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65   rc = -1;.    }e
f360: 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31  lse if( d1<nKey1
f370: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31   ){.      rc = 1
f380: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f390: 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20  d2<nKey2 ){.    
f3a0: 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d    rc = -1;.    }
f3b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65  .  }else if( pKe
f3c0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
f3d0: 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d  r && i<pKeyInfo-
f3e0: 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20  >nField.        
f3f0: 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e         && pKeyIn
f400: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
f410: 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72  ] ){.    rc = -r
f420: 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
f430: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f440: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
f450: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d   index entry com
f460: 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20  posed using the 
f470: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
f480: 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73  code..** The las
f490: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  t entry in this 
f4a0: 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
f4b0: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65   an integer (spe
f4c0: 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20  cifically.** an 
f4d0: 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20  integer rowid). 
f4e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
f4f0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
f500: 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20   of bytes in.** 
f510: 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  that integer..*/
f520: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f530: 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73  IdxRowidLen(cons
f540: 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
f550: 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
f560: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
f570: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
f580: 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
f590: 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
f5a0: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20  the rowid */..  
f5b0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
f5c0: 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29  32(aKey, &szHdr)
f5d0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  ;.  sqlite3GetVa
f5e0: 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48  rint32(&aKey[szH
f5f0: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69  dr-1], &typeRowi
f600: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  d);.  return sql
f610: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f620: 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
f630: 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43  ;.}.  ../*.** pC
f640: 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
f650: 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
f660: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
f670: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
f680: 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
f690: 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
f6a0: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
f6b0: 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
f6c0: 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
f6d0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f6e0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
f6f0: 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
f700: 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
f710: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f720: 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43  VdbeIdxRowid(BtC
f730: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
f740: 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
f750: 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
f760: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
f770: 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
f780: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
f790: 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
f7a0: 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
f7b0: 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
f7c0: 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
f7d0: 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
f7e0: 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
f7f0: 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
f800: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
f810: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
f820: 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
f830: 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20  CellKey<=0 ){.  
f840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f850: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f860: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f870: 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
f880: 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
f890: 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
f8a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
f8b0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c  rn rc;.  }.  sql
f8c0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
f8d0: 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72  (u8*)m.z, &szHdr
f8e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
f8f0: 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
f900: 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70  z[szHdr-1], &typ
f910: 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f  eRowid);.  lenRo
f920: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
f930: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
f940: 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  ypeRowid);.  sql
f950: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
f960: 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
f970: 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
f980: 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
f990: 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
f9a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
f9b0: 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
f9c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f9d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
f9e0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
f9f0: 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
fa00: 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
fa10: 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  t to against.** 
fa20: 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
fa30: 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74  n pKey (of lengt
fa40: 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20  h nKey).  Write 
fa50: 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
fa60: 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
fa70: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
fa80: 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
fa90: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
faa0: 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
fab0: 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79  reater than pKey
fac0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
fad0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
fae0: 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69  **.** pKey is ei
faf0: 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
fb00: 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
fb10: 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
fb20: 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
fb30: 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
fb40: 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
fb50: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
fb60: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
fb70: 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
fb80: 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   well..*/.int sq
fb90: 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
fba0: 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72  ompare(.  Cursor
fbb0: 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
fbc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
fbd0: 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
fbe0: 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20  gainst */.  int 
fbf0: 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nKey, const u8 *
fc00: 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b  pKey,   /* The k
fc10: 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ey to compare */
fc20: 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc40: 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
fc50: 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
fc60: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
fc70: 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
fc80: 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
fc90: 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
fca0: 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e  ursor;.  int len
fcb0: 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  Rowid;.  Mem m;.
fcc0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
fcd0: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
fce0: 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
fcf0: 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20  CellKey<=0 ){.  
fd00: 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
fd10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fd20: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
fd30: 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
fd40: 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
fd50: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
fd60: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
fd70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fd80: 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
fd90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
fda0: 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d  xRowidLen((u8*)m
fdb0: 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71  .z);.  *res = sq
fdc0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
fdd0: 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49  ompare(pC->pKeyI
fde0: 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  nfo, m.n-lenRowi
fdf0: 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b  d, m.z, nKey, pK
fe00: 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ey);.  sqlite3Vd
fe10: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
fe20: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fe30: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
fe40: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
fe50: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
fe60: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
fe70: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
fe80: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
fe90: 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
fea0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
feb0: 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
fec0: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
fed0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
fee0: 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 64  nt nChange){.  d
fef0: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
ff00: 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
ff10: 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
ff20: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
ff30: 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
ff40: 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
ff50: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
ff60: 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
ff70: 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
ff80: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
ff90: 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
ffa0: 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
ffb0: 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
ffc0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
ffd0: 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
ffe0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
fff0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
10000 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10010 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
10020 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
10030 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
10040 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
10050 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
10060 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
10070 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
10080 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
10090 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
100a0 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
100b0 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
100c0 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
100d0 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
100e0 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
100f0 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
10100 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
10110 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
10120 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
10130 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
10140 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
10150 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
10160 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
10170 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
10180 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
10190 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
101a0 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
101b0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
101c0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
101d0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
101e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
101f0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
10200 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10210 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
10220 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
10230 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
10240 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
10250 7d 0a                                            }.