/ Hex Artifact Content
Login

Artifact bfad18ca5d0372a34147ed98ac268b75ccb6858d:


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 54  rn p;.}../*.** T
0540: 75 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  urn tracing on o
0550: 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71  r off.*/.void sq
0560: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 56  lite3VdbeTrace(V
0570: 64 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72  dbe *p, FILE *tr
0580: 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65  ace){.  p->trace
0590: 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a   = trace;.}../*.
05a0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
05b0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
05c0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
05d0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
05e0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
05f0: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0600: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0610: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0620: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0630: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0640: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 20 0a  tain exactly N .
0650: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** elements..*/.
0660: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 69  static void resi
0670: 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  zeOpArray(Vdbe *
0680: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  p, int N){.  int
0690: 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d 61   runMode = p->ma
06a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
06b0: 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d 6f  RUN;.  if( runMo
06c0: 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  de || p->nOpAllo
06d0: 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  c<N ){.    VdbeO
06e0: 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  p *pNew;.    int
06f0: 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30 2a   nNew = N + 100*
0700: 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  (!runMode);.    
0710: 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d  int oldSize = p-
0720: 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  >nOpAlloc;.    p
0730: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0740: 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77  loc(p->aOp, nNew
0750: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0760: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0770: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0780: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d  = nNew;.      p-
0790: 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20  >aOp = pNew;.   
07a0: 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f 6c 64 53     if( nNew>oldS
07b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ize ){.        m
07c0: 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c  emset(&p->aOp[ol
07d0: 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e 4e 65 77  dSize], 0, (nNew
07e0: 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66  -oldSize)*sizeof
07f0: 28 4f 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (Op));.      }. 
0800: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0810: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0820: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0830: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0840: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0850: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0860: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0870: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0880: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0890: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
08a0: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
08b0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
08c0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
08d0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
08e0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
08f0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0900: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 20  **.**    p1, p2 
0910: 20 20 20 20 20 20 20 20 20 46 69 72 73 74 20 74           First t
0920: 77 6f 20 6f 66 20 74 68 65 20 74 68 72 65 65 20  wo of the three 
0930: 70 6f 73 73 69 62 6c 65 20 6f 70 65 72 61 6e 64  possible operand
0940: 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  s..**.** Use the
0950: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
0960: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
0970: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
0980: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
0990: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
09a0: 67 65 50 33 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP3() function 
09b0: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
09c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a  lue of the P3.**
09d0: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
09e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
09f0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  p(Vdbe *p, int o
0a00: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0a10: 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  2){.  int i;.  V
0a20: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69  dbeOp *pOp;..  i
0a30: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
0a40: 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  nOp++;.  assert(
0a50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0a60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0a70: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
0a80: 20 69 2b 31 29 3b 0a 20 20 69 66 28 20 70 2d 3e   i+1);.  if( p->
0a90: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 4f 70  aOp==0 || p->nOp
0aa0: 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20  Alloc<=i ){.    
0ab0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
0ac0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
0ad0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
0ae0: 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20  = op;.  pOp->p1 
0af0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0b00: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0b10: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 33 74 79  = 0;.  pOp->p3ty
0b20: 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b  pe = P3_NOTUSED;
0b30: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
0b40: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
0b50: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  _DEBUG.  if( sql
0b60: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
0b70: 74 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56  trace ) sqlite3V
0b80: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
0b90: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65   &p->aOp[i]);.#e
0ba0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b  ndif.  return i;
0bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
0bc0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
0bd0: 6c 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c  ludes the p3 val
0be0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
0bf0: 65 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a  e3VdbeOp3(Vdbe *
0c00: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0c10: 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74  1, int p2, const
0c20: 20 63 68 61 72 20 2a 7a 50 33 2c 69 6e 74 20 70   char *zP3,int p
0c30: 33 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61 64  3type){.  int ad
0c40: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
0c50: 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31 2c  AddOp(p, op, p1,
0c60: 20 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p2);.  sqlite3V
0c70: 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 61  dbeChangeP3(p, a
0c80: 64 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70 65  ddr, zP3, p3type
0c90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
0ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
0cb0: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
0cc0: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
0cd0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
0ce0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
0cf0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
0d00: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
0d10: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
0d20: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
0d30: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
0d40: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
0d50: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
0d60: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
0d70: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
0d80: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
0d90: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
0da0: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
0db0: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
0dc0: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
0dd0: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
0de0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
0df0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
0e00: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
0e10: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
0e20: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
0e30: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
0e40: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
0e50: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
0e60: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
0e70: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
0e80: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
0e90: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
0ea0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
0eb0: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
0ec0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
0ed0: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
0ee0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
0ef0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
0f00: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
0f10: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
0f20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
0f30: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
0f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
0f50: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
0f60: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
0f70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
0f80: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
0f90: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
0fa0: 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c      p->nLabelAll
0fb0: 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c  oc = p->nLabelAl
0fc0: 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20  loc*2 + 10;.    
0fd0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46  sqliteReallocOrF
0fe0: 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 2d 3e  ree((void**)&p->
0ff0: 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  aLabel,.        
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
1020: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
1030: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
1040: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
1050: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1060: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1070: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1080: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1090: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
10a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
10b0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
10c0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
10d0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
10e0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
10f0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1100: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
1110: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
1120: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
1130: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1140: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
1150: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
1160: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1170: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1180: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
11a0: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
11b0: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
11c0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
11d0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
11e0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
11f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1200: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
1210: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
1220: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
1230: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
1240: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
1250: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
1260: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1270: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1280: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1290: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
12a0: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
12b0: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
12c0: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
12d0: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
12e0: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
12f0: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
1300: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
1310: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
1320: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
1330: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
1340: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
1350: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
1360: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1370: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1380: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1390: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
13a0: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
13b0: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
13c0: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
13d0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
13e0: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
13f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
1400: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
1410: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
1420: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
1430: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
1440: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
1450: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
1460: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1470: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1480: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1490: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
14a0: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
14b0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
14c0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
14d0: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
14e0: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
14f0: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1500: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
1510: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
1520: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
1530: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
1540: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
1550: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
1560: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1570: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1580: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1590: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
15a0: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
15b0: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
15c0: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
15d0: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
15e0: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
15f0: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1600: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1610: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1620: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1630: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1640: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1650: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1660: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1670: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1680: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1690: 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 31 3c   (NOPUSH_MASK_1<
16a0: 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48  <16),.    NOPUSH
16b0: 5f 4d 41 53 4b 5f 32 20 2b 20 28 4e 4f 50 55 53  _MASK_2 + (NOPUS
16c0: 48 5f 4d 41 53 4b 5f 33 3c 3c 31 36 29 2c 0a 20  H_MASK_3<<16),. 
16d0: 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 34     NOPUSH_MASK_4
16e0: 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f   + (NOPUSH_MASK_
16f0: 35 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55  5<<16),.    NOPU
1700: 53 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 4e 4f 50  SH_MASK_6 + (NOP
1710: 55 53 48 5f 4d 41 53 4b 5f 37 3c 3c 31 36 29 2c  USH_MASK_7<<16),
1720: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1730: 5f 38 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53  _8 + (NOPUSH_MAS
1740: 4b 5f 39 3c 3c 31 36 29 0a 20 20 7d 3b 0a 20 20  K_9<<16).  };.  
1750: 61 73 73 65 72 74 28 20 6f 70 3c 33 32 2a 35 20  assert( op<32*5 
1760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73  );.  return (mas
1770: 6b 73 5b 6f 70 3e 3e 35 5d 20 26 20 28 31 3c 3c  ks[op>>5] & (1<<
1780: 28 6f 70 26 30 78 31 46 29 29 29 3b 0a 7d 0a 0a  (op&0x1F)));.}..
1790: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
17a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  nt sqlite3VdbeOp
17b0: 63 6f 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70  codeNoPush(u8 op
17c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 63 6f  ){.  return opco
17d0: 64 65 4e 6f 50 75 73 68 28 6f 70 29 3b 0a 7d 0a  deNoPush(op);.}.
17e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
17f0: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  op through the p
1800: 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66  rogram looking f
1810: 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61  or P2 values tha
1820: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
1830: 2a 2a 20 45 61 63 68 20 73 75 63 68 20 76 61 6c  ** Each such val
1840: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20  ue is a label.  
1850: 52 65 73 6f 6c 76 65 20 74 68 65 20 6c 61 62 65  Resolve the labe
1860: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
1870: 20 50 32 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20   P2.** value to 
1880: 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d  its correct non-
1890: 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  zero value..**.*
18a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18b0: 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66  s called once af
18c0: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
18d0: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
18e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ed..**.** Variab
18f0: 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  le *pMaxFuncArgs
1900: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d   is set to the m
1910: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  aximum value of 
1920: 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20  any P2 argument 
1930: 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e  .** to an OP_Fun
1940: 63 74 69 6f 6e 20 6f 72 20 4f 50 5f 41 67 67 53  ction or OP_AggS
1950: 74 65 70 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  tep opcode. This
1960: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
1970: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1980: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
1990: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
19a0: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
19b0: 20 69 6e 74 65 67 65 72 20 2a 70 4d 61 78 53 74   integer *pMaxSt
19c0: 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 74 68  ack is set to th
19d0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
19e0: 20 6f 66 20 76 64 62 65 20 73 74 61 63 6b 0a 2a   of vdbe stack.*
19f0: 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 73  * entries that s
1a00: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 72  tatic analysis r
1a10: 65 76 65 61 6c 73 20 74 68 69 73 20 70 72 6f 67  eveals this prog
1a20: 72 61 6d 20 6d 69 67 68 74 20 6e 65 65 64 2e 0a  ram might need..
1a30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a40: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68 65  ne also does the
1a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6d   following optim
1a60: 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63 61  ization:  It sca
1a70: 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c 74 20 69  ns for.** Halt i
1a80: 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72  nstructions wher
1a90: 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  e P1==SQLITE_CON
1aa0: 53 54 52 41 49 4e 54 20 6f 72 20 50 32 3d 3d 4f  STRAINT or P2==O
1ab0: 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f 72 0a 2a  E_Abort or for.*
1ac0: 2a 20 49 64 78 49 6e 73 65 72 74 20 69 6e 73 74  * IdxInsert inst
1ad0: 72 75 63 74 69 6f 6e 73 20 77 68 65 72 65 20 50  ructions where P
1ae0: 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20 73 75 63  2!=0.  If no suc
1af0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
1b00: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  .** found, then 
1b10: 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74 20  every Statement 
1b20: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 63  instruction is c
1b30: 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f 70  hanged to a Noop
1b40: 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73 20 77 61  .  In.** this wa
1b50: 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65 61  y, we avoid crea
1b60: 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ting the stateme
1b70: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  nt journal file 
1b80: 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e 0a 2a  unnecessarily..*
1b90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1ba0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64  solveP2Values(Vd
1bb0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78  be *p, int *pMax
1bc0: 46 75 6e 63 41 72 67 73 2c 20 69 6e 74 20 2a 70  FuncArgs, int *p
1bd0: 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20 69 6e 74  MaxStack){.  int
1be0: 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72   i;.  int nMaxAr
1bf0: 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4d  gs = 0;.  int nM
1c00: 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e 6e 4f 70  axStack = p->nOp
1c10: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
1c20: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
1c30: 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f  aLabel;.  int do
1c40: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1c50: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ack = 0;.  int h
1c60: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
1c70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 0;.  for(pOp=
1c80: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
1c90: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1ca0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
1cb0: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
1cc0: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
1cd0: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
1ce0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41   || opcode==OP_A
1cf0: 67 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20  ggStep ){.      
1d00: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
1d10: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1d20: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d  = pOp->p2;.    }
1d30: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1d40: 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20  =OP_Halt ){.    
1d50: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53    if( pOp->p1==S
1d60: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1d70: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
1d80: 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
1d90: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1da0: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
1db0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1dc0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ( opcode==OP_Idx
1dd0: 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
1de0: 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a 20  if( pOp->p2 ){. 
1df0: 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65         doesState
1e00: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  mentRollback = 1
1e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e20: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1e30: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  OP_Statement ){.
1e40: 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d 65        hasStateme
1e50: 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20  ntBegin = 1;.   
1e60: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   }..    if( opco
1e70: 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65 29  deNoPush(opcode)
1e80: 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53 74   ){.      nMaxSt
1e90: 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20  ack--;.    }..  
1ea0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d 30    if( pOp->p2>=0
1eb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ec0: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
1ed0: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
1ee0: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61  .    pOp->p2 = a
1ef0: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
1f00: 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  ];.  }.  sqliteF
1f10: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
1f20: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
1f30: 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ..  *pMaxFuncArg
1f40: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
1f50: 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d 61  *pMaxStack = nMa
1f60: 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  xStack;..  /* If
1f70: 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61   we never rollba
1f80: 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ck a statement t
1f90: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1fa0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
1fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1fc0: 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f   not needed.  So
1fd0: 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50   change every OP
1fe0: 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20  _Statement.  ** 
1ff0: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f  opcode into an O
2000: 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76  P_Noop.  This av
2010: 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  oid a call to sq
2020: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
2030: 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69 63  sive().  ** whic
2040: 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69  h can be expensi
2050: 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66  ve on some platf
2060: 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  orms..  */.  if(
2070: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
2080: 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74 65  in && !doesState
2090: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  mentRollback ){.
20a0: 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61      for(pOp=p->a
20b0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
20c0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
20d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
20e0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61  ->opcode==OP_Sta
20f0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
2100: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
2110: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  OP_Noop;.      }
2120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2130: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
2140: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2150: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2160: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
2170: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2180: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
2190: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
21a0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
21b0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
21c0: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
21d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
21e0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
21f0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
2200: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
2210: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
2220: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
2230: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
2240: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2250: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
2260: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
2270: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
2280: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
2290: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
22a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
22b0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
22c0: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20  esizeOpArray(p, 
22d0: 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29 3b 0a 20  p->nOp + nOp);. 
22e0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 68 72 65   if( sqlite3Thre
22f0: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
2300: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2310: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2320: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
2330: 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30  nOp;.  if( nOp>0
2340: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2350: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
2360: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
2370: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2380: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
2390: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
23a0: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
23b0: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
23c0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
23d0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
23e0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
23f0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
2400: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
2410: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c 30   pOut->p2 = p2<0
2420: 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   ? addr + ADDR(p
2430: 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20 70  2) : p2;.      p
2440: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70  Out->p3 = pIn->p
2450: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  3;.      pOut->p
2460: 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70 33 20  3type = pIn->p3 
2470: 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20 50 33  ? P3_STATIC : P3
2480: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
2490: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
24a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
24b0: 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65  vdbe_addop_trace
24c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24d0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
24e0: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
24f0: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
2500: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2510: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
2520: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
2530: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2540: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2550: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
2560: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2570: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2580: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2590: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
25a0: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
25b0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
25c0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
25d0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
25e0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
25f0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
2600: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2610: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2620: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
2630: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2640: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2650: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2660: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
2670: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2680: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
2690: 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f  addr>=0 && p->nO
26a0: 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70  p>addr && p->aOp
26b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
26c0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
26d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
26e0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
26f0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
2700: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2710: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
2720: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2730: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
2740: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
2750: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2760: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
2770: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2780: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2790: 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29  assert( val>=0 )
27a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
27b0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
27c0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
27d0: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
27e0: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
27f0: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2800: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
2810: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2820: 43 68 61 6e 67 65 20 74 65 68 20 50 32 20 6f 70  Change teh P2 op
2830: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
2840: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
2850: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
2860: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
2870: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2880: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
2890: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
28a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
28b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
28c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
28d0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
28e0: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 2f 2a  , p->nOp);.}../*
28f0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 33 20  .** Delete a P3 
2900: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
2910: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
2920: 69 64 20 66 72 65 65 50 33 28 69 6e 74 20 70 33  id freeP3(int p3
2930: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29 7b  type, void *p3){
2940: 0a 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20 20  .  if( p3 ){.   
2950: 20 73 77 69 74 63 68 28 20 70 33 74 79 70 65 20   switch( p3type 
2960: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 33  ){.      case P3
2970: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20  _DYNAMIC:.      
2980: 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a  case P3_KEYINFO:
2990: 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b  .      case P3_K
29a0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
29b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29c0: 46 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20  Free(p3);.      
29d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
29e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 56  .      case P3_V
29f0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
2a00: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
2a10: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
2a20: 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20  nc *)p3;.       
2a30: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
2a40: 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46  teAuxData(pVdbeF
2a50: 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unc, 0);.       
2a60: 20 73 71 6c 69 74 65 46 72 65 65 28 70 56 64 62   sqliteFree(pVdb
2a70: 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  eFunc);.        
2a80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2a90: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45 4d       case P3_MEM
2aa0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
2ab0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
2ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29  lite3_value*)p3)
2ad0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2ae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2af0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   }.}.../*.** Cha
2b00: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2b10: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
2b20: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2b30: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
2b40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2b50: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
2b60: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
2b70: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
2b80: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
2b90: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
2ba0: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
2bb0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
2bc0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
2bd0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
2be0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
2bf0: 74 68 65 6e 20 74 68 65 20 50 33 20 6f 70 65 72  then the P3 oper
2c00: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
2c10: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
2c20: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
2c30: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
2c40: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
2c50: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
2c60: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
2c70: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
2c80: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
2c90: 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  3 up to and incl
2ca0: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
2cb0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
2cc0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
2cd0: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 33  n+1 bytes of zP3
2ce0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 33  ..**.** If n==P3
2cf0: 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e  _KEYINFO it mean
2d00: 73 20 74 68 61 74 20 7a 50 33 20 69 73 20 61 20  s that zP3 is a 
2d10: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
2d20: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
2d30: 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  ** A copy is mad
2d40: 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f  e of the KeyInfo
2d50: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20   structure into 
2d60: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2d70: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 4d 61  from.** sqliteMa
2d80: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
2d90: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
2da0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
2db0: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48   n==P3_KEYINFO_H
2dc0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
2dd0: 20 74 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73   that zP3 points
2de0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
2df0: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
2e00: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
2e10: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
2e20: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2e30: 6c 69 74 65 4d 61 6c 6c 6f 63 2e 20 54 68 65 20  liteMalloc. The 
2e40: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
2e50: 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61  d not free the a
2e60: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69  llocation, it wi
2e70: 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e  ll be freed when
2e80: 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20   the Vdbe is.** 
2e90: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a  finalized..** .*
2ea0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
2eb0: 66 20 6e 20 28 50 33 5f 53 54 41 54 49 43 2c 20  f n (P3_STATIC, 
2ec0: 50 33 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P3_COLLSEQ etc.)
2ed0: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
2ee0: 50 33 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P3 points.** to 
2ef0: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
2f00: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
2f10: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
2f20: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
2f30: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
2f40: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
2f50: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
2f60: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
2f70: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
2f80: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 33 20 6f  then change P3 o
2f90: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
2fa0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
2fb0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
2fc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2fd0: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
2fe0: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
2ff0: 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29  har *zP3, int n)
3000: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  {.  Op *pOp;.  a
3010: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3020: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3030: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
3040: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 73  | p->aOp==0 || s
3050: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
3060: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 6d 61 6c 6c  ReadOnly()->mall
3070: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
3080: 69 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49  if (n != P3_KEYI
3090: 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65  NFO) {.      fre
30a0: 65 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  eP3(n, (void*)*(
30b0: 63 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20  char**)&zP3);.  
30c0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
30d0: 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30    }.  if( addr<0
30e0: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
30f0: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
3100: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69  ->nOp - 1;.    i
3110: 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75  f( addr<0 ) retu
3120: 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20  rn;.  }.  pOp = 
3130: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3140: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3150: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3160: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3170: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3180: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
3190: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
31a0: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P3_NOTUSED;.  }
31b0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b  else if( n==P3_K
31c0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
31d0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
31e0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
31f0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
3200: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
3210: 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP3)->nField;. 
3220: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3230: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3240: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3250: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3260: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3270: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3280: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
3290: 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d  Byte );.    pOp-
32a0: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65  >p3 = (char*)pKe
32b0: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
32c0: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
32d0: 20 63 68 61 72 20 2a 61 53 6f 72 74 4f 72 64 65   char *aSortOrde
32e0: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
32f0: 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e  pKeyInfo, zP3, n
3300: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f  Byte);.      aSo
3310: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
3320: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a  fo->aSortOrder;.
3330: 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f        if( aSortO
3340: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
3350: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3360: 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29 26 70  rder = (char*)&p
3370: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
3380: 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20  Field];.        
3390: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d  memcpy(pKeyInfo-
33a0: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f  >aSortOrder, aSo
33b0: 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29  rtOrder, nField)
33c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33d0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
33e0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65  _KEYINFO;.    }e
33f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  lse{.      pOp->
3400: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
3410: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
3420: 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59  se if( n==P3_KEY
3430: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
3440: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
3450: 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f  har*)zP3;.    pO
3460: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b  p->p3type = P3_K
3470: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3480: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3490: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
34a0: 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  zP3;.    pOp->p3
34b0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
34c0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
34d0: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33  ) n = strlen(zP3
34e0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
34f0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a   sqliteStrNDup(z
3500: 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P3, n);.    pOp-
3510: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59 4e  >p3type = P3_DYN
3520: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  AMIC;.  }.}..#if
3530: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
3540: 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 50 33  * Replace the P3
3550: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
3560: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
3570: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  d instruction wi
3580: 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 65  th.** comment te
3590: 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  xt..*/.void sqli
35a0: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
35b0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
35c0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
35d0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
35e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
35f0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
3600: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
3610: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
3620: 33 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  3==0 .          
3630: 7c 7c 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  || sqlite3Thread
3640: 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e  DataReadOnly()->
3650: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3660: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
3670: 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74  Format);.  sqlit
3680: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 70  e3VdbeChangeP3(p
3690: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 4d 50  , -1, sqlite3VMP
36a0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
36b0: 70 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  p), P3_DYNAMIC);
36c0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d  .  va_end(ap);.}
36d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
36e0: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
36f0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
3700: 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  ress..*/.VdbeOp 
3710: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
3720: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
3730: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
3740: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3750: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
3760: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
3770: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
3780: 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f  .  return &p->aO
3790: 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a 23 69 66 20  p[addr];.}..#if 
37a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
37b0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c  OMIT_EXPLAIN) ||
37c0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
37d0: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
37e0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
37f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
3800: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
3810: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
3820: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
3830: 20 74 68 65 20 50 33 20 70 61 72 61 6d 65 74 65   the P3 paramete
3840: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
3850: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
3860: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
3870: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
3880: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
3890: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 33   char *displayP3
38a0: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
38b0: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
38c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a  ){.  char *zP3;.
38d0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
38e0: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
38f0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 29 7b 0a   pOp->p3type ){.
3900: 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49      case P3_KEYI
3910: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
3920: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
3930: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
3940: 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e   (KeyInfo*)pOp->
3950: 70 33 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  p3;.      sprint
3960: 66 28 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66  f(zTemp, "keyinf
3970: 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  o(%d", pKeyInfo-
3980: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
3990: 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70  i = strlen(zTemp
39a0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
39b0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
39c0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
39d0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
39e0: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
39f0: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
3a00: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
3a10: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
3a20: 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e  strlen(pColl->zN
3a30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
3a40: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
3a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
3a60: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  trcpy(&zTemp[i],
3a70: 22 2c 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20 20  ",...");.       
3a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3aa0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
3ab0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ,';.          if
3ac0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
3ad0: 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e  tOrder && pKeyIn
3ae0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
3af0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
3b00: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
3b10: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
3b20: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
3b30: 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c  &zTemp[i], pColl
3b40: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3b50: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
3b60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
3b70: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
3b80: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
3b90: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29 3b  Temp[i],",nil");
3ba0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
3bb0: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
3bc0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
3bd0: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
3be0: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
3bf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
3c00: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
3c10: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
3c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3c30: 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c      case P3_COLL
3c40: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
3c50: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
3c60: 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b  ollSeq*)pOp->p3;
3c70: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3c80: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
3c90: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
3ca0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50 33  Name);.      zP3
3cb0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
3cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3cd0: 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46   case P3_FUNCDEF
3ce0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
3cf0: 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44  f *pDef = (FuncD
3d00: 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  ef*)pOp->p3;.   
3d10: 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d     char zNum[30]
3d20: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
3d30: 7a 54 65 6d 70 2c 20 22 25 2e 2a 73 22 2c 20 6e  zTemp, "%.*s", n
3d40: 54 65 6d 70 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  Temp, pDef->zNam
3d50: 65 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  e);.      sprint
3d60: 66 28 7a 4e 75 6d 2c 22 28 25 64 29 22 2c 20 70  f(zNum,"(%d)", p
3d70: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
3d80: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 54 65    if( strlen(zTe
3d90: 6d 70 29 2b 73 74 72 6c 65 6e 28 7a 4e 75 6d 29  mp)+strlen(zNum)
3da0: 2b 31 3c 3d 6e 54 65 6d 70 20 29 7b 0a 20 20 20  +1<=nTemp ){.   
3db0: 20 20 20 20 20 73 74 72 63 61 74 28 7a 54 65 6d       strcat(zTem
3dc0: 70 2c 20 7a 4e 75 6d 29 3b 0a 20 20 20 20 20 20  p, zNum);.      
3dd0: 7d 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  }.      zP3 = zT
3de0: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
3df0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
3e00: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33  ult: {.      zP3
3e10: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
3e20: 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20    if( zP3==0 || 
3e30: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
3e40: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
3e50: 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  zP3 = "";.      
3e60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3e70: 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64  turn zP3;.}.#end
3e80: 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  if...#if defined
3e90: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
3ea0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
3eb0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
3ec0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
3ed0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
3ee0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
3ef0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
3f00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3f10: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
3f20: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
3f30: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
3f40: 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP3;.  char zPtr
3f50: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
3f60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3f70: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
3f80: 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22 3b 0a   %4d %4d %s\n";.
3f90: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
3fa0: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
3fb0: 20 7a 50 33 20 3d 20 64 69 73 70 6c 61 79 50 33   zP3 = displayP3
3fc0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
3fd0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
3fe0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
3ff0: 61 74 31 2c 0a 20 20 20 20 20 20 70 63 2c 20 73  at1,.      pc, s
4000: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
4010: 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20  s[pOp->opcode], 
4020: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
4030: 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c 75 73 68  , zP3);.  fflush
4040: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
4050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4060: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
4070: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
4080: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
4090: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
40a0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
40b0: 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  p ){.    while( 
40c0: 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  N-->0 ){.      s
40d0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
40e0: 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d  ease(p++);.    }
40f0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
4100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
4110: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
4120: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
4130: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
4140: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
4150: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
4160: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
4170: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
4180: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
4190: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
41a0: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
41b0: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
41c0: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
41d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
41e0: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
41f0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
4200: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f  nt "EXPLAIN"..*/
4210: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
4220: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
4250: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
4260: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
4270: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
4280: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
4290: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
42a0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
42b0: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
42c0: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
42d0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65  E_MISUSE;.  asse
42e0: 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53  rt( db->magic==S
42f0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
4300: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
4310: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
4320: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
4330: 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  BUSY );..  /* Ev
4340: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
4350: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70  pcode does not p
4360: 75 74 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  ut dynamic strin
4370: 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  gs onto the.  **
4380: 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79   the stack, they
4390: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
43a0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
43b0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
43c0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
43d0: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
43e0: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
43f0: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
4400: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f 73  */.  if( p->pTos
4410: 3d 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20  ==&p->aStack[4] 
4420: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
4430: 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b  mArray(p->aStack
4440: 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72  , 5);.  }.  p->r
4450: 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a  esOnStack = 0;..
4460: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
4470: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
4480: 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e   i<p->nOp && p->
4490: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
44a0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
44b0: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
44c0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b  if( i>=p->nOp ){
44d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
44e0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
44f0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
4500: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c  }else if( db->fl
4510: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
4520: 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 64 62  errupt ){.    db
4530: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4540: 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20 20  TE_Interrupt;.  
4550: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4560: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
4570: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
4580: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
4590: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
45a0: 4d 73 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53  Msg, sqlite3ErrS
45b0: 74 72 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72  tr(p->rc), (char
45c0: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
45d0: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d     Op *pOp = &p-
45e0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d  >aOp[i];.    Mem
45f0: 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61   *pMem = p->aSta
4600: 63 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ck;.    pMem->fl
4610: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
4620: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
4630: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
4640: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b      pMem->i = i;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
4680: 65 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  er */.    pMem++
4690: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
46a0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
46b0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
46c0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
46d0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
46e0: 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b  es[pOp->opcode];
46f0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
4700: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72     pMem->n = str
4710: 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  len(pMem->z);.  
4720: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
4730: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
4740: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
4750: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65  TE_UTF8;.    pMe
4760: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
4770: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
4780: 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70  .    pMem->i = p
4790: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
47c0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
47d0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
47e0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
47f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
4800: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  t;.    pMem->i =
4810: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
4840: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
4850: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
4860: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
4870: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
4880: 53 68 6f 72 74 7c 4d 45 4d 5f 53 74 72 7c 4d 45  Short|MEM_Str|ME
4890: 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20  M_Term;   /* P3 
48a0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  */.    pMem->z =
48b0: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
48c0: 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69  pMem->zShort, si
48d0: 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72  zeof(pMem->zShor
48e0: 74 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  t));.    pMem->t
48f0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
4900: 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  T;.    pMem->enc
4910: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
4920: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
4930: 6d 6e 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65  mn = 5 - 2*(p->e
4940: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
4950: 2d 3e 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20  ->pTos = pMem;. 
4960: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
4970: 45 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73  E_OK;.    p->res
4980: 4f 6e 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20  OnStack = 1;.   
4990: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
49a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
49b0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
49c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
49d0: 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  IN */../*.** Pri
49e0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
49f0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
4a00: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
4a10: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
4a20: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
4a30: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 64 65  (Vdbe *p){.#ifde
4a40: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4a50: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
4a60: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
4a70: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
4a80: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
4a90: 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a  &p->aOp[nOp-1];.
4aa0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
4ab0: 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f  e==OP_Noop && pO
4ac0: 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20  p->p3!=0 ){.    
4ad0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
4ae0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69  pOp->p3;.    whi
4af0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
4b00: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
4b10: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
4b20: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 23 65  ]\n", z);.  }.#e
4b30: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
4b40: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
4b50: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
4b60: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
4b70: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
4b80: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
4b90: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
4ba0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
4bb0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
4bc0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
4bd0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
4be0: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
4bf0: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
4c00: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
4c10: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
4c20: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
4c30: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
4c40: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
4c50: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
4c60: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
4c70: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
4c80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4c90: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
4ca0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cc0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
4cd0: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
4d00: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
4d10: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
4d20: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4d40: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
4d50: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
4d60: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
4d70: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4d80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4d90: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
4da0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
4db0: 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20  isExplain       
4dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4dd0: 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49  ue if the EXPLAI
4de0: 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72  N keywords is pr
4df0: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  esent */.){.  in
4e00: 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t n;..  assert( 
4e10: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
4e20: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4e30: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
4e40: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
4e50: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
4e60: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
4e70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
4e80: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
4e90: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
4ea0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
4eb0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
4ec0: 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69  ter. This.   * i
4ed0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
4ee0: 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72  ll to resizeOpAr
4ef0: 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20  ray() below may 
4f00: 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20  shrink the.   * 
4f10: 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74  p->aOp[] array t
4f20: 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66  o save memory if
4f30: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20   called when in 
4f40: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a  VDBE_MAGIC_RUN .
4f50: 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a     * state..   *
4f60: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
4f70: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
4f80: 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74    /* No instruct
4f90: 69 6f 6e 20 65 76 65 72 20 70 75 73 68 65 73 20  ion ever pushes 
4fa0: 6d 6f 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67  more than a sing
4fb0: 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20  le element onto 
4fc0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20  the.  ** stack. 
4fd0: 20 41 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e   And the stack n
4fe0: 65 76 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75  ever grows on su
4ff0: 63 63 65 73 73 69 76 65 20 65 78 65 63 75 74 69  ccessive executi
5000: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
5010: 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74  same loop.  So t
5020: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
5030: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
5040: 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  is an upper boun
5050: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  d.  ** on the ma
5060: 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74  ximum stack dept
5070: 68 20 72 65 71 75 69 72 65 64 2e 20 20 28 41 64  h required.  (Ad
5080: 64 65 64 20 6c 61 74 65 72 3a 29 20 20 54 68 65  ded later:)  The
5090: 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56  .  ** resolveP2V
50a0: 61 6c 75 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d  alues() call com
50b0: 70 75 74 65 73 20 61 20 74 69 67 68 74 65 72 20  putes a tighter 
50c0: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  upper bound on t
50d0: 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 73 69  he.  ** stack si
50e0: 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c  ze..  **.  ** Al
50f0: 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65  location all the
5100: 20 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20   stack space we 
5110: 77 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a  will ever need..
5120: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53    */.  if( p->aS
5130: 74 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69  tack==0 ){.    i
5140: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f  nt nArg;       /
5150: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
5160: 20 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20   of args passed 
5170: 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69  to a user functi
5180: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
5190: 53 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61  Stack;     /* Ma
51a0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
51b0: 73 74 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65  stack entries re
51c0: 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65  quired */.    re
51d0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
51e0: 20 26 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29   &nArg, &nStack)
51f0: 3b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  ;.    resizeOpAr
5200: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ray(p, p->nOp);.
5210: 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72      assert( nVar
5220: 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
5230: 74 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70  t( nStack<p->nOp
5240: 20 29 3b 0a 20 20 20 20 6e 53 74 61 63 6b 20 3d   );.    nStack =
5250: 20 69 73 45 78 70 6c 61 69 6e 20 3f 20 31 30 20   isExplain ? 10 
5260: 3a 20 6e 53 74 61 63 6b 3b 0a 20 20 20 20 70 2d  : nStack;.    p-
5270: 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65  >aStack = sqlite
5280: 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  Malloc(.        
5290: 6e 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d  nStack*sizeof(p-
52a0: 3e 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f  >aStack[0])    /
52b0: 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20  * aStack */.    
52c0: 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28    + nArg*sizeof(
52d0: 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20  Mem*)           
52e0: 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20     /* apArg */. 
52f0: 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65       + nVar*size
5300: 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20  of(Mem)         
5310: 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f        /* aVar */
5320: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
5330: 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20  zeof(char*)     
5340: 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72          /* azVar
5350: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d   */.      + nMem
5360: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20  *sizeof(Mem)    
5370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
5380: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  em */.      + nC
5390: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72  ursor*sizeof(Cur
53a0: 73 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20  sor*)        /* 
53b0: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
53c0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
53d0: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
53e0: 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ly()->mallocFail
53f0: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
5400: 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Mem = &p->aStack
5410: 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20  [nStack];.      
5420: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a  p->nMem = nMem;.
5430: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
5440: 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a  &p->aMem[nMem];.
5450: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
5460: 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  nVar;.      p->o
5470: 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  kVar = 0;.      
5480: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a  p->apArg = (Mem*
5490: 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d  *)&p->aVar[nVar]
54a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
54b0: 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61   = (char**)&p->a
54c0: 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20  pArg[nArg];.    
54d0: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75    p->apCsr = (Cu
54e0: 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72  rsor**)&p->azVar
54f0: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
5500: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
5510: 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  or;.      for(n=
5520: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
5530: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
5540: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
5550: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Null;.      }.  
5560: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d    }.  }.  for(n=
5570: 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  0; n<p->nMem; n+
5580: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  +){.    p->aMem[
5590: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
55a0: 75 6c 6c 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ull;.  }..#ifdef
55b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
55c0: 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  if( (p->db->flag
55d0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 4c  s & SQLITE_VdbeL
55e0: 69 73 74 69 6e 67 29 21 3d 30 0a 20 20 20 20 7c  isting)!=0.    |
55f0: 7c 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  | sqlite3OsFileE
5600: 78 69 73 74 73 28 22 76 64 62 65 5f 65 78 70 6c  xists("vdbe_expl
5610: 61 69 6e 22 29 0a 20 20 29 7b 0a 20 20 20 20 69  ain").  ){.    i
5620: 6e 74 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 66  nt i;.    printf
5630: 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c  ("VDBE Program L
5640: 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20  isting:\n");.   
5650: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
5660: 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72  tSql(p);.    for
5670: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
5680: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
5690: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73  te3VdbePrintOp(s
56a0: 74 64 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  tdout, i, &p->aO
56b0: 70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  p[i]);.    }.  }
56c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
56d0: 46 69 6c 65 45 78 69 73 74 73 28 22 76 64 62 65  FileExists("vdbe
56e0: 5f 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20 20  _trace") ){.    
56f0: 70 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f 75  p->trace = stdou
5700: 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
5710: 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53  p->pTos = &p->aS
5720: 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70  tack[-1];.  p->p
5730: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
5740: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
5750: 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b  ->uniqueCnt = 0;
5760: 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74  .  p->returnDept
5770: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f  h = 0;.  p->erro
5780: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
5790: 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63  rt;.  p->popStac
57a0: 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70  k =  0;.  p->exp
57b0: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
57c0: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
57d0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
57e0: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
57f0: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
5800: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
5810: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
5820: 35 35 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f  55;.#ifdef VDBE_
5830: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
5840: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5850: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
5860: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
5870: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
5880: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
5890: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
58a0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
58b0: 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
58c0: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
58d0: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
58e0: 74 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70  that cursor happ
58f0: 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a  ens.** to hold..
5900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5910: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 43 75  dbeFreeCursor(Cu
5920: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
5930: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
5940: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
5950: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
5960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
5970: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
5980: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
5990: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
59a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
59b0: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
59c0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
59d0: 46 72 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29  Free(pCx->pData)
59e0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
59f0: 43 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71  Cx->aType);.  sq
5a00: 6c 69 74 65 46 72 65 65 28 70 43 78 29 3b 0a 7d  liteFree(pCx);.}
5a10: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
5a20: 6c 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61  l cursors.*/.sta
5a30: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
5a40: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
5a50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
5a60: 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20  ( p->apCsr==0 ) 
5a70: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
5a80: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
5a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
5aa0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
5ab0: 28 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20  (p->apCsr[i]);. 
5ac0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
5ad0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
5ae0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
5af0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
5b00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5b10: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
5b20: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
5b30: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
5b40: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
5b50: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
5b60: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
5b70: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
5b80: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
5b90: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
5ba0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
5bb0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
5bc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5bd0: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   i;.  if( p->aSt
5be0: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  ack ){.    relea
5bf0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
5c00: 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54  tack, 1 + (p->pT
5c10: 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29  os - p->aStack))
5c20: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
5c30: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
5c40: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
5c50: 72 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65  rsors(p);.  rele
5c60: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
5c70: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
5c80: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
5c90: 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29  Clear(&p->sFifo)
5ca0: 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65  ;.  if( p->conte
5cb0: 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66  xtStack ){.    f
5cc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e  or(i=0; i<p->con
5cd0: 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b  textStackTop; i+
5ce0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
5cf0: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
5d00: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
5d10: 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d  i].sFifo);.    }
5d20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
5d30: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
5d40: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
5d50: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
5d60: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
5d70: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
5d80: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
5d90: 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  0;.  sqliteFree(
5da0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
5db0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
5dc0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5dd0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
5de0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
5df0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
5e00: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
5e10: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
5e20: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
5e30: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
5e40: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
5e50: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
5e60: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
5e70: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
5e80: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
5e90: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
5ea0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
5eb0: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
5ec0: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
5ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
5ee0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
5ef0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
5f00: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
5f10: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 72 65 6c  ;.  int n;.  rel
5f20: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
5f30: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
5f40: 73 43 6f 6c 75 6d 6e 2a 32 29 3b 0a 20 20 73 71  sColumn*2);.  sq
5f50: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c  liteFree(p->aCol
5f60: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
5f70: 73 43 6f 6c 75 6d 6e 2a 32 3b 0a 20 20 70 2d 3e  sColumn*2;.  p->
5f80: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  nResColumn = nRe
5f90: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
5fa0: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
5fb0: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
5fc0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 4d  Malloc( sizeof(M
5fd0: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
5fe0: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
5ff0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
6000: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
6010: 28 70 43 6f 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c  (pColName++)->fl
6020: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
6030: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
6040: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6050: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
6060: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
6070: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
6080: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
6090: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
60a0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
60b0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
60c0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
60d0: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
60e0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
60f0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
6100: 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f  .**.** If N==P3_
6110: 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73  STATIC  it means
6120: 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61   that zName is a
6130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f   pointer to a co
6140: 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a  nstant static.**
6150: 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63   string and we c
6160: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
6170: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
6180: 69 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74  is P3_DYNAMIC, t
6190: 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69  hen .** the stri
61a0: 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e  ng is freed usin
61b0: 67 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 77  g sqliteFree() w
61c0: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
61d0: 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a  finished with.**
61e0: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
61f0: 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65  N bytes of zName
6200: 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a   are copied..*/.
6210: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
6220: 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a  etColName(Vdbe *
6230: 70 2c 20 69 6e 74 20 69 64 78 2c 20 63 6f 6e 73  p, int idx, cons
6240: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
6250: 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b  nt N){.  int rc;
6260: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
6270: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
6280: 28 32 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  (2*p->nResColumn
6290: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
62a0: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
62b0: 4f 6e 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  Only()->mallocFa
62c0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
62d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73  LITE_NOMEM;.  as
62e0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
62f0: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
6300: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
6310: 6d 65 5b 69 64 78 5d 29 3b 0a 20 20 69 66 28 20  me[idx]);.  if( 
6320: 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c  N==P3_DYNAMIC ||
6330: 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b   N==P3_STATIC ){
6340: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6350: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
6360: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
6370: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
6380: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
6390: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
63a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
63b0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
63c0: 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49  , zName, N, SQLI
63d0: 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
63e0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20  RANSIENT);.  }. 
63f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6400: 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41  OK && N==P3_DYNA
6410: 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  MIC ){.    pColN
6420: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43  ame->flags = (pC
6430: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e  olName->flags&(~
6440: 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d  MEM_Static))|MEM
6450: 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  _Dyn;.    pColNa
6460: 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  me->xDel = 0;.  
6470: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6480: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
6490: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
64a0: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
64b0: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
64c0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
64d0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
64e0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
64f0: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
6500: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
6510: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6520: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
6530: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
6540: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
6550: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
6560: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
6570: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
6580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6590: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
65a0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
65b0: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
65c0: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
65d0: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
65e0: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
65f0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
6600: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6610: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
6620: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  Xcommit = 0;..  
6630: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
6640: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
6650: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6660: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6670: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
6680: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
6690: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
66a0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
66b0: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
66c0: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
66d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
66e0: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
66f0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
6700: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
6710: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
6720: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
6730: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
6740: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
6750: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
6760: 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  f(db);.    rc = 
6770: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
6780: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
6790: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
67a0: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
67b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
67c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
67d0: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
67e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
67f0: 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
6800: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
6810: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
6820: 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
6830: 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
6840: 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
6850: 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
6860: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
6870: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
6880: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
6890: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
68a0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
68b0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
68c0: 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
68d0: 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
68e0: 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
68f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
6900: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49   is :memory:.  I
6910: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  n that case we d
6920: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f  o.  ** not suppo
6930: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
6940: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
6950: 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65 20   use the simple 
6960: 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74  case then.  ** t
6970: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
6980: 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33  ==strlen(sqlite3
6990: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
69a0: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
69b0: 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29  ) || nTrans<=1 )
69c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
69d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
69e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
69f0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
6a00: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
6a10: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
6a20: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
6a30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
6a40: 79 6e 63 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ync(pBt, 0);.   
6a50: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
6a60: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
6a70: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
6a80: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
6a90: 6c 6c 79 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20  lly synced */.  
6aa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6ab0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  _OK ){.      for
6ac0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
6ad0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42   i++){.        B
6ae0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6af0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6b00: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
6b10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6b20: 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
6b30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6b40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
6b50: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
6b60: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
6b70: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
6b80: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
6b90: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
6ba0: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
6bb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6bc0: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
6be0: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
6bf0: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
6c00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
6c10: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
6c20: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
6c30: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
6c40: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
6c50: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
6c60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6c70: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
6c80: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
6c90: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
6ca0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
6cb0: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 4f 73 46  0].pBt);.    OsF
6cc0: 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b  ile *master = 0;
6cd0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
6ce0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6cf0: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
6d00: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
6d10: 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73   random;.      s
6d20: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
6d30: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
6d40: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
6d50: 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e  of(random), &ran
6d60: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73  dom);.      zMas
6d70: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
6d80: 69 6e 74 66 28 22 25 73 2d 6d 6a 25 30 38 58 22  intf("%s-mj%08X"
6d90: 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e  , zMainFile, ran
6da0: 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b  dom&0x7fffffff);
6db0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
6dc0: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ter ){.        r
6dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6de0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
6df0: 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 4f  }while( sqlite3O
6e00: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
6e10: 74 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ter) );..    /* 
6e20: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
6e30: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
6e40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
6e50: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d 61 73  enExclusive(zMas
6e60: 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20 30 29  ter, &master, 0)
6e70: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
6e80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6e90: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
6ea0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
6eb0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
6ec0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
6ed0: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
6ee0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
6ef0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
6f00: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
6f10: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
6f20: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
6f30: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
6f40: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
6f50: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
6f60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6f70: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
6f80: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
6f90: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
6fa0: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
6fb0: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
6fc0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
6fd0: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
6fe0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
6ff0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
7000: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
7010: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
7020: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
7030: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
7040: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
7050: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
7060: 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e    if( i==1 ) con
7070: 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f  tinue;   /* Igno
7080: 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
7090: 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  base */.      if
70a0: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
70b0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
70c0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
70d0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
70e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
70f0: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
7100: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
7110: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
7120: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
7130: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
7140: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
7150: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
7160: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
7170: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
7180: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
7190: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
71a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
71b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
71c0: 65 28 6d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  e(master, zFile,
71d0: 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31   strlen(zFile)+1
71e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
71f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7200: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7210: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
7220: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
7230: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
7240: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
7250: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
7260: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
7270: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
7280: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7290: 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   }...    /* Sync
72a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
72b0: 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f 72 65  nal file. Before
72c0: 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f 70 65   doing this, ope
72d0: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  n the directory.
72e0: 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65      ** the maste
72f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
7300: 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20 74 68  s store in so th
7310: 61 74 20 69 74 20 67 65 74 73 20 73 79 6e 63 65  at it gets synce
7320: 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  d too..    */.  
7330: 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    zMainFile = sq
7340: 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
7350: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
7360: 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  pBt);.    rc = s
7370: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
7380: 63 74 6f 72 79 28 6d 61 73 74 65 72 2c 20 7a 4d  ctory(master, zM
7390: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
73a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
73b0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 6e 65  ||.          (ne
73c0: 65 64 53 79 6e 63 20 26 26 20 28 72 63 3d 73 71  edSync && (rc=sq
73d0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 6d 61 73 74  lite3OsSync(mast
73e0: 65 72 2c 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f  er,0))!=SQLITE_O
73f0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  K) ){.      sqli
7400: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
7410: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
7420: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74  e3OsDelete(zMast
7430: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
7440: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
7450: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
7460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
7470: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
7480: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
7490: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
74a0: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
74b0: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
74c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
74d0: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
74e0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
74f0: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
7500: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
7510: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
7520: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7530: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
7540: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
7550: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
7560: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
7570: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
7580: 65 53 79 6e 63 28 29 2c 0a 20 20 20 20 2a 2a 20  eSync(),.    ** 
7590: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
75a0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
75b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
75c0: 69 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ile will be.    
75d0: 2a 2a 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  ** orphaned. But
75e0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
75f0: 65 20 69 74 2c 20 69 6e 20 63 61 73 65 20 74 68  e it, in case th
7600: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7610: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  .    ** file nam
7620: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
7630: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
7640: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
7650: 61 69 6c 75 72 65 0a 20 20 20 20 2a 2a 20 6f 63  ailure.    ** oc
7660: 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cured..    */.  
7670: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
7680: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
7690: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
76a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
76b0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26        if( pBt &&
76c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
76d0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
76e0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
76f0: 74 65 33 42 74 72 65 65 53 79 6e 63 28 70 42 74  te3BtreeSync(pBt
7700: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
7710: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7720: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
7730: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
7740: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(&master);.    
7750: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
7760: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
7770: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
7780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7790: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
77a0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
77b0: 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 6c  er);..    /* Del
77c0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
77d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
77e0: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
77f0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
7800: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
7810: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
7820: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
7830: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
7840: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
7850: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
7860: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
7870: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
7880: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
7890: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
78a0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
78b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
78c0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
78d0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
78e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
78f0: 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 7a 4d  SyncDirectory(zM
7900: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
7910: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7920: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
7930: 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e 20 54 68   is not good. Th
7940: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7950: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 64   file has been d
7960: 65 6c 65 74 65 64 2c 20 62 75 74 0a 20 20 20 20  eleted, but.    
7970: 20 20 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f    ** the directo
7980: 72 79 20 73 79 6e 63 20 66 61 69 6c 65 64 2e 20  ry sync failed. 
7990: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70  There is no comp
79a0: 6c 65 74 65 6c 79 20 73 61 66 65 20 63 6f 75 72  letely safe cour
79b0: 73 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  se of.      ** a
79c0: 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65 72 65 2e  ction from here.
79d0: 20 54 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   The individual 
79e0: 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74 61 69 6e  journals contain
79f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7a00: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  .      ** master
7a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 62   journal file, b
7a20: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
7a30: 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 69 66  ay of knowing if
7a40: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d   that.      ** m
7a50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
7a60: 69 73 74 73 20 6e 6f 77 20 6f 72 20 69 66 20 69  ists now or if i
7a70: 74 20 77 69 6c 6c 20 65 78 69 73 74 20 61 66 74  t will exist aft
7a80: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  er the operating
7a90: 0a 20 20 20 20 20 20 2a 2a 20 73 79 73 74 65 6d  .      ** system
7aa0: 20 63 72 61 73 68 20 74 68 61 74 20 6d 61 79 20   crash that may 
7ab0: 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73 79 6e 63  follow the fsync
7ac0: 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 20 20  () failure..    
7ad0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
7ae0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
7af0: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
7b00: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
7b10: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
7b20: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
7b30: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
7b40: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
7b50: 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 61 72  BtreeCommit() ar
7b60: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
7b70: 69 6c 65 73 20 61 6e 64 20 64 65 6c 65 74 69 6e  iles and deletin
7b80: 67 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  g.    ** journal
7b90: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
7ba0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
7bb0: 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
7bc0: 6e 67 20 77 65 20 64 6f 6e 27 74 0a 20 20 20 20  ng we don't.    
7bd0: 2a 2a 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  ** really care. 
7be0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
7bf0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7c00: 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
7c10: 61 6e 74 65 65 64 2c 0a 20 20 20 20 2a 2a 20 62  anteed,.    ** b
7c20: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
7c30: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 20 6d 61  old' journals ma
7c40: 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
7c50: 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 0a  d. Returning an.
7c60: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
7c70: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
7c80: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
7c90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
7ca0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
7cb0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7cc0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7cd0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
7ce0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
7cf0: 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b  treeCommit(pBt);
7d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7d10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
7d20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7d30: 20 46 69 6e 64 20 65 76 65 72 79 20 61 63 74 69   Find every acti
7d40: 76 65 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e  ve VM other than
7d50: 20 70 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67   pVdbe and chang
7d60: 65 20 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a  e its status to.
7d70: 2a 2a 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69  ** aborted.  Thi
7d80: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f  s happens when o
7d90: 6e 65 20 56 4d 20 63 61 75 73 65 73 20 61 20 72  ne VM causes a r
7da0: 6f 6c 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61  ollback due to a
7db0: 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  n.** ON CONFLICT
7dc0: 20 52 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65   ROLLBACK clause
7dd0: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20   (for example). 
7de0: 20 54 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d   The other VMs m
7df0: 75 73 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65  ust be.** aborte
7e00: 64 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 64  d so that they d
7e10: 6f 20 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20  o not have data 
7e20: 72 6f 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20  rolled out from 
7e30: 75 6e 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68  underneath.** th
7e40: 65 6d 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20  em leading to a 
7e50: 73 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61  segfault..*/.sta
7e60: 74 69 63 20 76 6f 69 64 20 61 62 6f 72 74 4f 74  tic void abortOt
7e70: 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28 56  herActiveVdbes(V
7e80: 64 62 65 20 2a 70 56 64 62 65 29 7b 0a 20 20 56  dbe *pVdbe){.  V
7e90: 64 62 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66  dbe *pOther;.  f
7ea0: 6f 72 28 70 4f 74 68 65 72 3d 70 56 64 62 65 2d  or(pOther=pVdbe-
7eb0: 3e 64 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68  >db->pVdbe; pOth
7ec0: 65 72 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65  er; pOther=pOthe
7ed0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
7ee0: 66 28 20 70 4f 74 68 65 72 3d 3d 70 56 64 62 65  f( pOther==pVdbe
7ef0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7f00: 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67   if( pOther->mag
7f10: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
7f20: 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63  UN || pOther->pc
7f30: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
7f40: 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f     closeAllCurso
7f50: 72 73 28 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  rs(pOther);.    
7f60: 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64 20  pOther->aborted 
7f70: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  = 1;.  }.}../* .
7f80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7f90: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
7fa0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
7fb0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
7fc0: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
7fd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
7fe0: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
7ff0: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
8000: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
8010: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
8020: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
8030: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
8040: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
8050: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
8060: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
8070: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
8080: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
8090: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
80a0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
80b0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
80c0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
80d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
80e0: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
80f0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
8100: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8110: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
8120: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  cnt = 0;.  p = d
8130: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
8140: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
8150: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
8160: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
8170: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
8180: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t++;.    }.    p
8190: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
81a0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
81b0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
81c0: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
81d0: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
81e0: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
81f0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
8200: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8210: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
8220: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
8230: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
8240: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
8250: 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
8260: 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
8270: 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
8280: 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
8290: 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
82a0: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
82b0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
82c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
82d0: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
82e0: 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
82f0: 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
8300: 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
8310: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
8320: 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ALT..**.** Retur
8330: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
8340: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
8350: 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
8360: 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
8370: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
8380: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
8390: 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
83a0: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
83b0: 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
83c0: 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
83d0: 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
83e0: 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
83f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8400: 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
8410: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8420: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
8430: 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63  i;.  int (*xFunc
8440: 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20  )(Btree *pBt) = 
8450: 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  0;  /* Function 
8460: 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20  to call on each 
8470: 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f  btree backend */
8480: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
8490: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
84a0: 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  y()->mallocFaile
84b0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
84c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
84d0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67   }..  if( p->mag
84e0: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
84f0: 55 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 72  UN ){.    /* Alr
8500: 65 61 64 79 20 68 61 6c 74 65 64 2e 20 20 4e 6f  eady halted.  No
8510: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 2a 2f 0a  thing to do. */.
8520: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d      assert( p->m
8530: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
8540: 5f 48 41 4c 54 20 29 3b 0a 20 20 20 20 72 65 74  _HALT );.    ret
8550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8560: 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
8570: 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b  sors(p);.  check
8580: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
8590: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63 3c 30  );.  if( p->pc<0
85a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f   ){.    /* No co
85b0: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
85c0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
85d0: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
85e0: 72 74 65 64 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  rted */.  }else 
85f0: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
8600: 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65  it && db->active
8610: 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 0a 20  VdbeCnt==1 ){.. 
8620: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
8630: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
8640: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
8650: 61 69 6c 20 26 26 20 70 2d 3e 72 63 21 3d 53 51  ail && p->rc!=SQ
8660: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 29 7b 0a 20 20  LITE_NOMEM)){.  
8670: 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
8680: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
8690: 72 75 65 2c 20 74 68 65 72 65 20 61 72 65 20 6e  rue, there are n
86a0: 6f 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 71  o other active q
86b0: 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20  ueries.      ** 
86c0: 75 73 69 6e 67 20 74 68 69 73 20 68 61 6e 64 6c  using this handl
86d0: 65 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70  e and the vdbe p
86e0: 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
86f0: 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 0a  ssful or hit an.
8700: 20 20 20 20 20 20 2a 2a 20 27 4f 52 20 46 41 49        ** 'OR FAI
8710: 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54  L' constraint. T
8720: 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
8730: 69 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  it is required..
8740: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
8750: 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d  nt rc = vdbeComm
8760: 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20 69 66  it(db);.      if
8770: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
8780: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  Y ){.        ret
8790: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
87a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
87b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
87c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
87d0: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71  = rc;.        sq
87e0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
87f0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (db);.      }els
8800: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8810: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
8820: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
8830: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
8850: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
8860: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20    }.  }else{..  
8870: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8880: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
8890: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
88a0: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
88b0: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
88c0: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
88d0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
88e0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
88f0: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
8900: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
8910: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
8920: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
8930: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
8940: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8950: 61 6c 20 20 20 20 20 20 20 20 20 20 2d 3e 20 72  al          -> r
8960: 6f 6c 6c 62 61 63 6b 20 73 74 61 74 65 6d 65 6e  ollback statemen
8970: 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  t.      **     Q
8980: 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61  uery without sta
8990: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 20  tement journal  
89a0: 20 20 20 20 20 2d 3e 20 72 6f 6c 6c 62 61 63 6b       -> rollback
89b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
89c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
89d0: 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74  e could do somet
89e0: 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e  hing more elegan
89f0: 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61 74  t than this stat
8a00: 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65  ic analysis (i.e
8a10: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65  ..      ** store
8a20: 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75 65   the type of que
8a30: 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ry as part of th
8a40: 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68  e compliation ph
8a50: 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20  ase), but .     
8a60: 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c   ** handling mal
8a70: 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 69 73  loc() failure is
8a80: 20 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72   a fairly obscur
8a90: 65 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 74  e edge case so t
8aa0: 68 69 73 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  his is.      ** 
8ab0: 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e  probably easier.
8ac0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
8ad0: 2a 2a 20 54 6f 64 6f 3a 20 54 68 69 73 20 6d 65  ** Todo: This me
8ae0: 61 6e 73 20 77 65 20 61 6c 77 61 79 73 20 6f 76  ans we always ov
8af0: 65 72 72 69 64 65 20 74 68 65 20 70 2d 3e 65 72  erride the p->er
8b00: 72 6f 72 41 63 74 69 6f 6e 20 76 61 6c 75 65 20  rorAction value 
8b10: 66 6f 72 20 61 0a 20 20 20 20 20 20 2a 2a 20 6d  for a.      ** m
8b20: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
8b30: 20 49 73 20 74 68 65 72 65 20 61 6e 79 20 6f 74   Is there any ot
8b40: 68 65 72 20 63 68 6f 69 63 65 20 68 65 72 65 20  her choice here 
8b50: 74 68 6f 75 67 68 3f 0a 20 20 20 20 20 20 2a 2f  though?.      */
8b60: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 52 65 61  .      int isRea
8b70: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  dOnly = 1;.     
8b80: 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74   int isStatement
8b90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
8ba0: 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e  rt(p->aOp || p->
8bb0: 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66  nOp==0);.      f
8bc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
8bd0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
8be0: 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b   switch( p->aOp[
8bf0: 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  i].opcode ){.   
8c00: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54         case OP_T
8c10: 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20  ransaction:.    
8c20: 20 20 20 20 20 20 20 20 69 73 52 65 61 64 4f 6e          isReadOn
8c30: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
8c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8c50: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
8c60: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
8c70: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
8c80: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
8c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8ca0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8cb0: 69 66 28 20 28 69 73 52 65 61 64 4f 6e 6c 79 7c  if( (isReadOnly|
8cc0: 7c 69 73 53 74 61 74 65 6d 65 6e 74 29 20 26 26  |isStatement) &&
8cd0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 21   p->errorAction!
8ce0: 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  =OE_Rollback ){.
8cf0: 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f 72          p->error
8d00: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
8d10: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  t;.      }else{ 
8d20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f  .        p->erro
8d30: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 52 6f 6c  rAction = OE_Rol
8d40: 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  lback;.      }. 
8d50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
8d60: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
8d70: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
8d80: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
8d90: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
8da0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
8db0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
8dc0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
8dd0: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
8de0: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
8df0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
8e00: 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tmt;.    }else{.
8e10: 20 20 20 20 20 20 61 62 6f 72 74 4f 74 68 65 72        abortOther
8e20: 41 63 74 69 76 65 56 64 62 65 73 28 70 29 3b 0a  ActiveVdbes(p);.
8e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
8e40: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
8e50: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
8e60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
8e70: 7d 0a 0a 20 20 2f 2a 20 49 66 20 78 46 75 6e 63  }..  /* If xFunc
8e80: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
8e90: 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  en it is one of 
8ea0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  .  ** sqlite3Btr
8eb0: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f  eeRollbackStmt o
8ec0: 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  r sqlite3BtreeCo
8ed0: 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69  mmitStmt. Call i
8ee0: 74 20 6f 6e 63 65 20 6f 6e 0a 20 20 2a 2a 20 65  t once on.  ** e
8ef0: 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20  ach backend. If 
8f00: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8f10: 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
8f20: 6f 64 65 20 69 73 20 73 74 69 6c 6c 0a 20 20 2a  ode is still.  *
8f30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  * SQLITE_OK, set
8f40: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
8f50: 20 74 6f 20 74 68 65 20 6e 65 77 20 65 72 72 6f   to the new erro
8f60: 72 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  r value..  */.  
8f70: 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c  assert(!xFunc ||
8f80: 0a 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69  .    xFunc==sqli
8f90: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
8fa0: 6d 74 20 7c 7c 0a 20 20 20 20 78 46 75 6e 63 3d  mt ||.    xFunc=
8fb0: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c  =sqlite3BtreeRol
8fc0: 6c 62 61 63 6b 53 74 6d 74 0a 20 20 29 3b 0a 20  lbackStmt.  );. 
8fd0: 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20   for(i=0; xFunc 
8fe0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
8ff0: 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 3b  +){ .    int rc;
9000: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
9010: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
9020: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b  ;.    if( pBt ){
9030: 0a 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e  .      rc = xFun
9040: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  c(pBt);.      if
9050: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
9060: 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b  OK ) p->rc = rc;
9070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9080: 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
9090: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
90a0: 72 20 44 45 4c 45 54 45 2c 20 73 65 74 20 74 68  r DELETE, set th
90b0: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
90c0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 63 68  . */.  if( p->ch
90d0: 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e  angeCntOn && p->
90e0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
90f0: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
9100: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
9110: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
9120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
9130: 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
9140: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 65 6c  Change);.    }el
9150: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9160: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
9170: 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  db, 0);.    }.  
9180: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
9190: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  ;.  }..  /* Roll
91a0: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
91b0: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
91c0: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
91d0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 21   */.  if( p->rc!
91e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62  =SQLITE_OK && db
91f0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
9200: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
9210: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
9220: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
9230: 62 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d 3e 66  b, 0);.    db->f
9240: 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  lags = (db->flag
9250: 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s | SQLITE_Inter
9260: 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 7d 0a 0a  nChanges);.  }..
9270: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
9280: 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
9290: 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
92a0: 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
92b0: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
92c0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
92d0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
92e0: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  t--;.  }.  p->ma
92f0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
9300: 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
9310: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
9320: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
9330: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
9340: 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
9350: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
9360: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
9370: 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
9380: 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
9390: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
93a0: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
93b0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
93c0: 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
93d0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
93e0: 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
93f0: 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
9400: 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
9410: 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
9420: 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
9430: 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
9440: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
9450: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
9460: 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
9470: 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
9480: 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
9490: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
94a0: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
94b0: 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
94c0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
94d0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
94e0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
94f0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 6d  AGIC_RUN && p->m
9500: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
9510: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 73 71 6c  _HALT ){.    sql
9520: 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c  ite3Error(p->db,
9530: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
9540: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0);.    return S
9550: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
9560: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  }..  /* If the V
9570: 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
9580: 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
9590: 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
95a0: 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
95b0: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
95c0: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
95d0: 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
95e0: 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
95f0: 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
9600: 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
9610: 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
9620: 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
9630: 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
9640: 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
9650: 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
9660: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
9670: 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
9680: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
9690: 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
96a0: 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
96b0: 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
96c0: 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
96d0: 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
96e0: 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
96f0: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
9700: 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
9710: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
9720: 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
9730: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
9740: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
9750: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45  ){.    if( p->zE
9760: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
9770: 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64  qlite3Error(p->d
9780: 62 2c 20 70 2d 3e 72 63 2c 20 22 25 73 22 2c 20  b, p->rc, "%s", 
9790: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
97a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
97b0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
97c0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
97d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
97e0: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
97f0: 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62  lite3Error(p->db
9800: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
9810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9820: 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62  lite3Error(p->db
9830: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
9840: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
9850: 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
9860: 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
9870: 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
9880: 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
9890: 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
98a0: 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
98b0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
98c0: 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
98d0: 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
98e0: 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
98f0: 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
9900: 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
9910: 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
9920: 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
9930: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
9940: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
9950: 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c, 0);.  }..  /*
9960: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
9970: 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
9980: 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
9990: 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
99a0: 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
99b0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
99c0: 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
99d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
99e0: 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70  Tos<&p->aStack[p
99f0: 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20  ->pc<0?0:p->pc] 
9a00: 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29 3b  || !p->aStack );
9a10: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
9a20: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
9a30: 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
9a40: 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
9a50: 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
9a60: 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
9a70: 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
9a80: 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
9a90: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9aa0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
9ab0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
9ac0: 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
9ad0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
9ae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
9af0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
9b00: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
9b10: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
9b20: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
9b30: 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
9b40: 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
9b50: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
9b60: 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
9b70: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
9b80: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
9b90: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
9ba0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
9bb0: 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
9bc0: 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
9bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9be0: 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
9bf0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
9c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
9c10: 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
9c20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
9c30: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
9c40: 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f  C_INIT;.  p->abo
9c50: 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
9c60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43  p->rc==SQLITE_SC
9c70: 48 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69  HEMA ){.    sqli
9c80: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
9c90: 53 63 68 65 6d 61 28 70 2d 3e 64 62 2c 20 30 29  Schema(p->db, 0)
9ca0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9cb0: 2d 3e 72 63 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  ->rc;.}. ./*.** 
9cc0: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
9cd0: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
9ce0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
9cf0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
9d00: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
9d10: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
9d20: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
9d30: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
9d40: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
9d50: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
9d60: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
9d70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9d80: 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d  _OK;..  if( p->m
9d90: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
9da0: 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
9db0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
9dc0: 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
9dd0: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
9de0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
9df0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
9e00: 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
9e10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
9e20: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
9e30: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
9e40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9e50: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ../*.** Call the
9e60: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
9e70: 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74  each auxdata ent
9e80: 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20  ry in pVdbeFunc 
9e90: 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65  for which.** the
9ea0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
9eb0: 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c  it in mask is cl
9ec0: 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e  ear.  Auxdata en
9ed0: 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a  tries beyond 31.
9ee0: 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65  ** are always de
9ef0: 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73  stroyed.  To des
9f00: 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61  troy all auxdata
9f10: 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74   entries, call t
9f20: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  his.** routine w
9f30: 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a  ith mask==0..*/.
9f40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9f50: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
9f60: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
9f70: 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  c, int mask){.  
9f80: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
9f90: 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e  ; i<pVdbeFunc->n
9fa0: 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Aux; i++){.    s
9fb0: 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70  truct AuxData *p
9fc0: 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63  Aux = &pVdbeFunc
9fd0: 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20  ->apAux[i];.    
9fe0: 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d  if( (i>31 || !(m
9ff0: 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20  ask&(1<<i))) && 
a000: 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20  pAux->pAux ){.  
a010: 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
a020: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
a030: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
a040: 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
a050: 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e    }.      pAux->
a060: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
a070: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
a080: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
a090: 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
a0a0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
a0b0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
a0c0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
a0d0: 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28  turn;.  Cleanup(
a0e0: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
a0f0: 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
a100: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
a110: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
a120: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
a130: 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
a140: 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d    p->db->pVdbe =
a150: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
a160: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
a170: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
a180: 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
a190: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
a1a0: 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  p ){.    for(i=0
a1b0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
a1c0: 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f 70 20  {.      Op *pOp 
a1d0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
a1e0: 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e      freeP3(pOp->
a1f0: 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29  p3type, pOp->p3)
a200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a210: 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a  teFree(p->aOp);.
a220: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
a230: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
a240: 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74  ->nVar);.  sqlit
a250: 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29  eFree(p->aLabel)
a260: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
a270: 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c  ->aStack);.  rel
a280: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
a290: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
a2a0: 73 43 6f 6c 75 6d 6e 2a 32 29 3b 0a 20 20 73 71  sColumn*2);.  sq
a2b0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c  liteFree(p->aCol
a2c0: 4e 61 6d 65 29 3b 0a 20 20 70 2d 3e 6d 61 67 69  Name);.  p->magi
a2d0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
a2e0: 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  EAD;.  sqliteFre
a2f0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(p);.}../*.** I
a300: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
a310: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
a320: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
a330: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
a340: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
a350: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
a360: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
a370: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
a380: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
a390: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
a3a0: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
a3b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
a3c0: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
a3d0: 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b  veto(Cursor *p){
a3e0: 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
a3f0: 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
a400: 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 20 20 20  int res, rc;.   
a410: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
a420: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
a430: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
a440: 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
a450: 69 66 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  if( p->isTable )
a460: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a470: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
a480: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
a490: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
a4a0: 26 72 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  &res);.    }else
a4b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a4c0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
a4d0: 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63 68 61 72  p->pCursor,(char
a4e0: 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  *)&p->movetoTarg
a4f0: 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 73 69 7a 65 6f 66 28 69 36 34 29 2c 26 72    sizeof(i64),&r
a520: 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  es);.    }.    i
a530: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a540: 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72  c;.    *p->pIncr
a550: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Key = 0;.    p->
a560: 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54  lastRowid = keyT
a570: 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61  oInt(p->movetoTa
a580: 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f  rget);.    p->ro
a590: 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73  widIsValid = res
a5a0: 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ==0;.    if( res
a5b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
a5c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
a5d0: 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  t(p->pCursor, &r
a5e0: 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
a5f0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
a600: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a610: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
a620: 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
a630: 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
a640: 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
a650: 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
a660: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
a670: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
a680: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
a690: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
a6a0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
a6b0: 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
a6c0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
a6d0: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
a6e0: 62 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a  beSerialRead().*
a6f0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
a700: 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
a710: 74 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69  te3VdbeSerialWri
a720: 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  te().**.** encap
a730: 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
a740: 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
a750: 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
a760: 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
a770: 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
a780: 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
a790: 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
a7a0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
a7b0: 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
a7c0: 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
a7d0: 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
a7e0: 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
a7f0: 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
a800: 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
a810: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
a820: 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
a830: 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
a840: 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
a850: 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
a860: 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
a870: 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
a880: 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
a890: 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
a8a0: 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
a8b0: 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
a8c0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
a8d0: 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
a8e0: 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
a8f0: 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
a900: 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
a910: 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
a920: 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
a930: 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
a940: 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
a950: 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a  ob seperately..*
a960: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
a970: 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
a980: 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
a990: 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
a9a0: 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
a9b0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
a9c0: 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
a9d0: 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
a9e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
a9f0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
aa00: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
aa10: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
aa40: 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
aa70: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
aa80: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
aab0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
aac0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
aad0: 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
aae0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
aaf0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
ab20: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
ab30: 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
ab50: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
ab60: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
ab70: 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
ab80: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
ab90: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
aba0: 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
abd0: 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
abe0: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
abf0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
ac00: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
ac10: 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
ac40: 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
ac50: 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
ac60: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
ac90: 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
aca0: 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
acb0: 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
acc0: 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
acd0: 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
ace0: 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
acf0: 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
ad00: 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
ad10: 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
ad20: 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
ad30: 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
ad40: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
ad50: 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
ad60: 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
ad70: 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
ad80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
ad90: 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
ada0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
adb0: 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
adc0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
add0: 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
ade0: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
adf0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
ae00: 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 69  Mem->flags;..  i
ae10: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
ae20: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
ae30: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
ae40: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
ae50: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
ae60: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
ae70: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
ae80: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
ae90: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
aea0: 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30 30  ((i64)0x00001000
aeb0: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
aec0: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20  4 i = pMem->i;. 
aed0: 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
aee0: 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ( file_format>=4
aef0: 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a   && (i&1)==i ){.
af00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 69        return 8+i
af10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20  ;.    }.    u = 
af20: 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20  i<0 ? -i : i;.  
af30: 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72    if( u<=127 ) r
af40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
af50: 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
af60: 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
af70: 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
af80: 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
af90: 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
afa0: 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
afb0: 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
afc0: 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
afd0: 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
afe0: 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
aff0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
b000: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
b010: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
b020: 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a  nt n = pMem->n;.
b030: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30      assert( n>=0
b040: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
b050: 28 6e 2a 32 29 20 2b 20 31 33 29 3b 0a 20 20 7d  (n*2) + 13);.  }
b060: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
b070: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65 74  _Blob ){.    ret
b080: 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b  urn (pMem->n*2 +
b090: 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   12);.  }.  retu
b0a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b0b0: 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
b0c0: 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
b0d0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b0e0: 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
b0f0: 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-type..*/.int s
b100: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
b110: 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
b120: 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
b130: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
b140: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
b150: 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
b160: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b170: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
b180: 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  Size[] = { 0, 1,
b190: 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20   2, 3, 4, 6, 8, 
b1a0: 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  8, 0, 0, 0, 0 };
b1b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a  .    return aSiz
b1c0: 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  e[serial_type];.
b1d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69    }.}../*.** Wri
b1e0: 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
b1f0: 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
b200: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
b210: 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
b220: 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
b230: 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
b240: 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
b250: 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
b260: 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
b270: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
b280: 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a  es written..*/ .
b290: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
b2a0: 65 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65  erialPut(unsigne
b2b0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 4d 65 6d  d char *buf, Mem
b2c0: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
b2d0: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20  _format){.  u32 
b2e0: 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71  serial_type = sq
b2f0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
b300: 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66  ype(pMem, file_f
b310: 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65  ormat);.  int le
b320: 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
b330: 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
b340: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
b350: 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
b360: 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
b370: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b380: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
b390: 3d 37 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =7 ){.      v = 
b3a0: 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 72 3b  *(u64*)&pMem->r;
b3b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b3c0: 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d    v = *(u64*)&pM
b3d0: 65 6d 2d 3e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  em->i;.    }.   
b3e0: 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
b3f0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
b400: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
b410: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
b420: 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
b430: 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20   = (v&0xFF);.   
b440: 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
b450: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
b460: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
b470: 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
b480: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
b490: 3d 31 32 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  =12 ){.    len =
b4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
b4b0: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
b4c0: 5f 74 79 70 65 29 3b 0a 20 20 20 20 6d 65 6d 63  _type);.    memc
b4d0: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
b4e0: 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
b4f0: 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
b500: 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
b510: 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
b520: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
b530: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
b540: 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
b550: 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
b560: 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
b570: 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
b580: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
b590: 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
b5a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b5b0: 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
b5c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
b5d0: 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
b5e0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
b5f0: 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
b600: 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
b610: 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
b620: 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
b630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
b640: 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
b650: 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
b660: 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
b670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
b680: 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
b690: 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
b6a0: 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
b6b0: 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
b6c0: 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
b6d0: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
b6e0: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
b6f0: 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
b700: 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
b710: 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
b720: 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
b730: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
b740: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b750: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b760: 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
b770: 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
b780: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
b790: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 73 69     pMem->i = (si
b7a0: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
b7b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
b7c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
b7d0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b7e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
b7f0: 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
b800: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
b810: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28       pMem->i = (
b820: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
b830: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
b840: 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
b850: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
b860: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
b870: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b880: 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
b890: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
b8a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  .      pMem->i =
b8b0: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
b8c0: 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
b8d0: 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
b8e0: 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
b8f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b900: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
b910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b920: 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
b930: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
b940: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20  /.      pMem->i 
b950: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
b960: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
b970: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
b980: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
b990: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
b9a0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
b9b0: 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
b9c0: 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
b9d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
b9e0: 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
b9f0: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
ba00: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
ba10: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
ba20: 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
ba30: 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
ba40: 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
ba50: 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
ba60: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
ba70: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a       pMem->i = *
ba80: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
ba90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
baa0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
bab0: 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
bac0: 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
bad0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
bae0: 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
baf0: 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
bb00: 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
bb10: 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
bb20: 20 20 75 33 32 20 79 3b 0a 23 69 66 6e 64 65 66    u32 y;.#ifndef
bb30: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a   NDEBUG.      /*
bb40: 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
bb50: 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
bb60: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
bb70: 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
bb80: 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
bb90: 2e 20 20 54 68 65 20 62 79 74 65 20 6f 72 64 65  .  The byte orde
bba0: 72 20 64 69 66 66 65 72 73 20 6f 6e 20 73 6f 6d  r differs on som
bbb0: 65 20 28 62 72 6f 6b 65 6e 29 20 61 72 63 68 69  e (broken) archi
bbc0: 74 65 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20  tectures..      
bbd0: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
bbe0: 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
bbf0: 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
bc00: 3c 3c 33 32 3b 0a 20 20 20 20 20 20 61 73 73 65  <<32;.      asse
bc10: 72 74 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62 6c  rt( 1.0==*(doubl
bc20: 65 2a 29 26 74 31 20 29 3b 0a 23 65 6e 64 69 66  e*)&t1 );.#endif
bc30: 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
bc40: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
bc50: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
bc60: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
bc70: 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
bc80: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
bc90: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
bca0: 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
bcb0: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
bcc0: 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
bcd0: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
bce0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  .        pMem->i
bcf0: 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
bd00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
bd10: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
bd20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bd30: 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f    pMem->r = *(do
bd40: 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20 20  uble*)&x;.      
bd50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
bd60: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
bd70: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
bd80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bd90: 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
bda0: 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
bdb0: 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
bdc0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
bdd0: 2d 3e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  ->i = serial_typ
bde0: 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
bdf0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
be00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
be10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
be20: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
be30: 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
be40: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
be50: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
be60: 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
be70: 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
be80: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
be90: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
bea0: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
beb0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
bec0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
bed0: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
bee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bef0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
bf00: 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
bf10: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
bf20: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
bf30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bf40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
bf50: 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 72 65  e header of a re
bf60: 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66  cord consists of
bf70: 20 61 20 73 65 71 75 65 6e 63 65 20 76 61 72 69   a sequence vari
bf80: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
bf90: 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20 69  gers..** These i
bfa0: 6e 74 65 67 65 72 73 20 61 72 65 20 61 6c 6d 6f  ntegers are almo
bfb0: 73 74 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c 20  st always small 
bfc0: 61 6e 64 20 61 72 65 20 65 6e 63 6f 64 65 64 20  and are encoded 
bfd0: 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  as a single byte
bfe0: 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ..** The followi
bff0: 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  ng macro takes a
c000: 64 76 61 6e 74 61 67 65 20 74 68 69 73 20 66 61  dvantage this fa
c010: 63 74 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ct to provide a 
c020: 66 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20 6f  fast decode.** o
c030: 66 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 69  f the integers i
c040: 6e 20 61 20 72 65 63 6f 72 64 20 68 65 61 64 65  n a record heade
c050: 72 2e 20 20 49 74 20 69 73 20 66 61 73 74 65 72  r.  It is faster
c060: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
c070: 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 74 68  case.** where th
c080: 65 20 69 6e 74 65 67 65 72 20 69 73 20 61 20 73  e integer is a s
c090: 69 6e 67 6c 65 20 62 79 74 65 2e 20 20 49 74 20  ingle byte.  It 
c0a0: 69 73 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  is a little slow
c0b0: 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 69  er when the.** i
c0c0: 6e 74 65 67 65 72 20 69 73 20 74 77 6f 20 6f 72  nteger is two or
c0d0: 20 6d 6f 72 65 20 62 79 74 65 73 2e 20 20 42 75   more bytes.  Bu
c0e0: 74 20 6f 76 65 72 61 6c 6c 20 69 74 20 69 73 20  t overall it is 
c0f0: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  faster..**.** Th
c100: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
c110: 65 73 73 69 6f 6e 73 20 61 72 65 20 65 71 75 69  essions are equi
c120: 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  valent:.**.**   
c130: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74    x = sqlite3Get
c140: 56 61 72 69 6e 74 33 32 28 20 41 2c 20 26 42 20  Varint32( A, &B 
c150: 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d  );.**.**     x =
c160: 20 47 65 74 56 61 72 69 6e 74 28 20 41 2c 20 42   GetVarint( A, B
c170: 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e   );.**.*/.#defin
c180: 65 20 47 65 74 56 61 72 69 6e 74 28 41 2c 42 29  e GetVarint(A,B)
c190: 20 20 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d 30    ((B = *(A))<=0
c1a0: 78 37 66 20 3f 20 31 20 3a 20 73 71 6c 69 74 65  x7f ? 1 : sqlite
c1b0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 20  3GetVarint32(A, 
c1c0: 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  &B))../*.** This
c1d0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
c1e0: 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
c1f0: 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
c200: 65 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 64  ecords specified
c210: 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20   by .** {nKey1, 
c220: 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79  pKey1} and {nKey
c230: 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72  2, pKey2}, retur
c240: 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c  ning a negative,
c250: 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
c260: 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
c270: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69  {nKey1, pKey1} i
c280: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
c290: 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
c2a0: 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32  ater than {nKey2
c2b0: 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20  , pKey2}.  Both 
c2c0: 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75  Key1 and Key2 mu
c2d0: 73 74 20 62 65 20 62 79 74 65 20 73 74 72 69 6e  st be byte strin
c2e0: 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62  gs.** composed b
c2f0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
c300: 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
c310: 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73  e VDBE..*/.int s
c320: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
c330: 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
c340: 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74  *userData,.  int
c350: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
c360: 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e  id *pKey1, .  in
c370: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
c380: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
c390: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
c3a0: 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73  o = (KeyInfo*)us
c3b0: 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31  erData;.  u32 d1
c3c0: 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f  , d2;          /
c3d0: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
c3e0: 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
c3f0: 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
c400: 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20  32 idx1, idx2;  
c410: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
c420: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
c430: 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
c440: 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
c450: 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75  , szHdr2;  /* Nu
c460: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
c470: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
c480: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
c490: 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
c4a0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
c4b0: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
c4c0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
c4d0: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
c4e0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
c4f0: 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20  d char *aKey2 = 
c500: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
c510: 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20  char *)pKey2;.. 
c520: 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d   Mem mem1;.  Mem
c530: 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e   mem2;.  mem1.en
c540: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
c550: 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20  c;.  mem2.enc = 
c560: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
c570: 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56 61   .  idx1 = GetVa
c580: 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64  rint(aKey1, szHd
c590: 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
c5a0: 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74  r1;.  idx2 = Get
c5b0: 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a  Varint(aKey2, sz
c5c0: 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a  Hdr2);.  d2 = sz
c5d0: 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  Hdr2;.  nField =
c5e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
c5f0: 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
c600: 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c  <szHdr1 && idx2<
c610: 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33  szHdr2 ){.    u3
c620: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
c630: 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
c640: 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype2;..    /* Re
c650: 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
c660: 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
c670: 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
c680: 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
c690: 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20  1 += GetVarint( 
c6a0: 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
c6b0: 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
c6c0: 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
c6d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c6e0: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
c6f0: 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
c700: 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47  k;.    idx2 += G
c710: 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b  etVarint( aKey2+
c720: 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx2, serial_typ
c730: 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32  e2 );.    if( d2
c740: 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74  >=nKey2 && sqlit
c750: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
c760: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32  Len(serial_type2
c770: 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
c780: 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
c790: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
c7a0: 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 65   space left in e
c7b0: 61 63 68 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ach key for the 
c7c0: 62 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64  blob of.    ** d
c7d0: 61 74 61 20 74 6f 20 67 6f 20 77 69 74 68 20 74  ata to go with t
c7e0: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6a  he serial type j
c7f0: 75 73 74 20 72 65 61 64 2e 20 54 68 69 73 20 61  ust read. This a
c800: 73 73 65 72 74 20 6d 61 79 20 66 61 69 6c 20 69  ssert may fail i
c810: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  f.    ** the fil
c820: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
c830: 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 76   Then read the v
c840: 61 6c 75 65 20 66 72 6f 6d 20 65 61 63 68 20 6b  alue from each k
c850: 65 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20  ey into mem1.   
c860: 20 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65 73   ** and mem2 res
c870: 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a  pectively..    *
c880: 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
c890: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
c8a0: 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
c8b0: 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
c8c0: 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c  );.    d2 += sql
c8d0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
c8e0: 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65  t(&aKey2[d2], se
c8f0: 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d  rial_type2, &mem
c900: 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  2);..    rc = sq
c910: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
c920: 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c  &mem1, &mem2, i<
c930: 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
c940: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
c950: 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66  ;.    if( mem1.f
c960: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
c970: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
c980: 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20  elease(&mem1);. 
c990: 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67     if( mem2.flag
c9a0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71  s & MEM_Dyn ) sq
c9b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
c9c0: 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20  ase(&mem2);.    
c9d0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
c9e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c9f0: 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
ca00: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65  /* One of the ke
ca10: 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
ca20: 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68  elds, but all th
ca30: 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
ca40: 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77  hat point.  ** w
ca50: 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
ca60: 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69  e incrKey flag i
ca70: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
ca80: 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20   second key is. 
ca90: 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c   ** treated as l
caa0: 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  arger..  */.  if
cab0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
cac0: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63  f( pKeyInfo->inc
cad0: 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  rKey ){.      rc
cae0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
caf0: 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b   if( d1<nKey1 ){
cb00: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
cb10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c     }else if( d2<
cb20: 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20 72  nKey2 ){.      r
cb30: 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  c = -1;.    }.  
cb40: 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
cb50: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
cb60: 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  & i<pKeyInfo->nF
cb70: 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20  ield.           
cb80: 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d      && pKeyInfo-
cb90: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
cba0: 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a  {.    rc = -rc;.
cbb0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
cbc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
cbd0: 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e  rgument is an in
cbe0: 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73  dex entry compos
cbf0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
cc00: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
cc10: 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65  e..** The last e
cc20: 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63  ntry in this rec
cc30: 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  ord should be an
cc40: 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66   integer (specif
cc50: 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74  ically.** an int
cc60: 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68  eger rowid).  Th
cc70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
cc80: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
cc90: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61   bytes in.** tha
cca0: 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e  t integer..*/.in
ccb0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
ccc0: 52 6f 77 69 64 4c 65 6e 28 69 6e 74 20 6e 4b 65  RowidLen(int nKe
ccd0: 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  y, const u8 *aKe
cce0: 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  y){.  u32 szHdr;
ccf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cd00: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
cd10: 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
cd20: 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
cd30: 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
cd40: 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47 65   */..  sqlite3Ge
cd50: 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
cd60: 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74  &szHdr);.  sqlit
cd70: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  e3GetVarint32(&a
cd80: 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74  Key[szHdr-1], &t
cd90: 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74  ypeRowid);.  ret
cda0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53  urn sqlite3VdbeS
cdb0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
cdc0: 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f  eRowid);.}.  ../
cdd0: 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
cde0: 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
cdf0: 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
ce00: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
ce10: 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
ce20: 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
ce30: 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
ce40: 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
ce50: 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
ce60: 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
ce70: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
ce80: 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
ce90: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
cea0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
ceb0: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
cec0: 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
ced0: 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
cee0: 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b  .  i64 nCellKey;
cef0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
cf00: 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
cf10: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
cf20: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
cf30: 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
cf40: 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
cf50: 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
cf60: 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
cf70: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
cf80: 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
cf90: 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  v;..  sqlite3Btr
cfa0: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
cfb0: 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66  &nCellKey);.  if
cfc0: 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b  ( nCellKey<=0 ){
cfd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cfe0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cff0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
d000: 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
d010: 72 65 65 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  ree(pCur, 0, nCe
d020: 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
d030: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
d040: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
d050: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
d060: 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a  32((u8*)m.z, &sz
d070: 48 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  Hdr);.  sqlite3G
d080: 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
d090: 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26  &m.z[szHdr-1], &
d0a0: 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65  typeRowid);.  le
d0b0: 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
d0c0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
d0d0: 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  n(typeRowid);.  
d0e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d0f0: 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
d100: 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
d110: 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
d120: 2a 72 6f 77 69 64 20 3d 20 76 2e 69 3b 0a 20 20  *rowid = v.i;.  
d130: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
d140: 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
d150: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d160: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
d170: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
d180: 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
d190: 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
d1a0: 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  nt to against.**
d1b0: 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
d1c0: 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67  in pKey (of leng
d1d0: 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65  th nKey).  Write
d1e0: 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
d1f0: 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
d200: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
d210: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
d220: 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
d230: 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
d240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65  greater than pKe
d250: 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
d260: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d270: 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65  .**.** pKey is e
d280: 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
d290: 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
d2a0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
d2b0: 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
d2c0: 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
d2d0: 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
d2e0: 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
d2f0: 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
d300: 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
d310: 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  s well..*/.int s
d320: 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
d330: 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f  Compare(.  Curso
d340: 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
d350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
d360: 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
d370: 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
d380: 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20   nKey, const u8 
d390: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
d3a0: 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  key to compare *
d3b0: 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
d3e0: 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
d3f0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
d400: 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20  nCellKey;.  int 
d410: 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
d420: 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  pCur = pC->pCurs
d430: 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77  or;.  int lenRow
d440: 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  id;.  Mem m;..  
d450: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
d460: 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
d470: 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c  Key);.  if( nCel
d480: 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a  lKey<=0 ){.    *
d490: 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
d4a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d4b0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
d4c0: 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
d4d0: 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
d4e0: 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  , nCellKey, 1, &
d4f0: 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
d500: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d510: 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
d520: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
d530: 77 69 64 4c 65 6e 28 6d 2e 6e 2c 20 28 75 38 2a  widLen(m.n, (u8*
d540: 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20  )m.z);.  *res = 
d550: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
d560: 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65  dCompare(pC->pKe
d570: 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f  yInfo, m.n-lenRo
d580: 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20  wid, m.z, nKey, 
d590: 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  pKey);.  sqlite3
d5a0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
d5b0: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
d5c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d5d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
d5e0: 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
d5f0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
d600: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
d610: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
d620: 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
d630: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
d640: 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
d650: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
d660: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
d670: 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
d680: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
d690: 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
d6a0: 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
d6b0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
d6c0: 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
d6d0: 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
d6e0: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
d6f0: 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
d700: 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
d710: 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
d720: 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
d730: 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
d740: 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
d750: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
d760: 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
d770: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
d780: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
d790: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d7a0: 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
d7b0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
d7c0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
d7d0: 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
d7e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
d7f0: 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
d800: 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
d810: 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
d820: 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
d830: 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
d840: 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
d850: 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
d860: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
d870: 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
d880: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
d890: 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
d8a0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
d8b0: 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
d8c0: 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
d8d0: 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
d8e0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
d8f0: 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
d900: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
d910: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
d920: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
d930: 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
d940: 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
d950: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
d960: 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
d970: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
d980: 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
d990: 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
d9a0: 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
d9b0: 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
d9c0: 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
d9d0: 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
d9e0: 3b 0a 7d 0a                                      ;.}.