/ Hex Artifact Content
Login

Artifact 0c4af4af29d42a7f008c7562afee58b470dd6d4a:


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 73 71 6c   i+1);.  if( sql
0a90: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
0aa0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
0ab0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   0;.  }.  pOp = 
0ac0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0ad0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a  p->opcode = op;.
0ae0: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a    pOp->p1 = p1;.
0af0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a    pOp->p2 = p2;.
0b00: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
0b10: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
0b20: 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e  3_NOTUSED;.  p->
0b30: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66  expired = 0;.#if
0b40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0b50: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
0b60: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
0b70: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0b80: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0b90: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  Op[i]);.#endif. 
0ba0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
0bb0: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
0bc0: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
0bd0: 74 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f  the p3 value..*/
0be0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0bf0: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
0c00: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
0c10: 20 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   p2, const char 
0c20: 2a 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29  *zP3,int p3type)
0c30: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
0c40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0c50: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a  p, op, p1, p2);.
0c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
0c70: 6e 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP3(p, addr, z
0c80: 50 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72  P3, p3type);.  r
0c90: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
0ca0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
0cb0: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
0cc0: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
0cd0: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
0ce0: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
0cf0: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
0d00: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
0d10: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
0d20: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
0d30: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
0d40: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
0d50: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
0d60: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
0d70: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
0d80: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
0d90: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
0da0: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
0db0: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
0dc0: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
0dd0: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
0de0: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
0df0: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
0e00: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
0e10: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
0e30: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
0e40: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
0e50: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
0e60: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
0e70: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
0e80: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
0e90: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
0ea0: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
0eb0: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
0ec0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
0ed0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
0ee0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  resolved..**.** 
0ef0: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
0f00: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
0f10: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
0f20: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
0f30: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
0f40: 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c  t i;.  i = p->nL
0f50: 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74  abel++;.  assert
0f60: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0f70: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0f80: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65   if( i>=p->nLabe
0f90: 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  lAlloc ){.    p-
0fa0: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70  >nLabelAlloc = p
0fb0: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20  ->nLabelAlloc*2 
0fc0: 2b 20 31 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  + 10;.    sqlite
0fd0: 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28  3ReallocOrFree((
0fe0: 76 6f 69 64 2a 2a 29 26 70 2d 3e 61 4c 61 62 65  void**)&p->aLabe
0ff0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1010: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
1020: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1030: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1040: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1050: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
1060: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1070: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1080: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1090: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
10a0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
10b0: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
10c0: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
10d0: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
10e0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
10f0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1100: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1110: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1120: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
1130: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1140: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
1150: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
1160: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
1170: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1180: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1190: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
11a0: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
11b0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
11c0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
11d0: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
11e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
11f0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1200: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1210: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
1220: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
1230: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
1240: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
1250: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
1260: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
1270: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
1280: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
1290: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
12a0: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
12b0: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
12c0: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
12d0: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
12e0: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
12f0: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1300: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1310: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
1320: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
1330: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
1340: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
1350: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
1360: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
1370: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
1380: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
1390: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
13a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
13b0: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
13c0: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
13d0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
13e0: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
13f0: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1400: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1410: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1420: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
1430: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
1440: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
1450: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
1460: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
1470: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
1480: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
1490: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
14a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
14b0: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
14c0: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
14d0: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
14e0: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
14f0: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1500: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1510: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1520: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1530: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1540: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1550: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
1560: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
1570: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
1580: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
1590: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
15a0: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
15b0: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
15c0: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
15d0: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
15e0: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
15f0: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1600: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1610: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1620: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1630: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1640: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1650: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
1660: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
1670: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
1680: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 4e 4f 50  SH_MASK_0 + (NOP
1690: 55 53 48 5f 4d 41 53 4b 5f 31 3c 3c 31 36 29 2c  USH_MASK_1<<16),
16a0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
16b0: 5f 32 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53  _2 + (NOPUSH_MAS
16c0: 4b 5f 33 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f  K_3<<16),.    NO
16d0: 50 55 53 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 4e  PUSH_MASK_4 + (N
16e0: 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 3c 3c 31 36  OPUSH_MASK_5<<16
16f0: 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41  ),.    NOPUSH_MA
1700: 53 4b 5f 36 20 2b 20 28 4e 4f 50 55 53 48 5f 4d  SK_6 + (NOPUSH_M
1710: 41 53 4b 5f 37 3c 3c 31 36 29 2c 0a 20 20 20 20  ASK_7<<16),.    
1720: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1730: 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 3c 3c  (NOPUSH_MASK_9<<
1740: 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72  16).  };.  asser
1750: 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20 20  t( op<32*5 );.  
1760: 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f 70  return (masks[op
1770: 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26 30  >>5] & (1<<(op&0
1780: 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64  x1F)));.}..#ifnd
1790: 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
17a0: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 4e  lite3VdbeOpcodeN
17b0: 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20  oPush(u8 op){.  
17c0: 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f 50  return opcodeNoP
17d0: 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69  ush(op);.}.#endi
17e0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68  f../*.** Loop th
17f0: 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61  rough the progra
1800: 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32  m looking for P2
1810: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
1820: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45 61   negative..** Ea
1830: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
1840: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
1850: 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79 20  ve the label by 
1860: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a 2a  setting the P2.*
1870: 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  * value to its c
1880: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
1890: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
18a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18b0: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
18c0: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
18d0: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
18e0: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
18f0: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
1900: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1910: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
1920: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
1930: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
1940: 20 6f 72 20 4f 50 5f 41 67 67 53 74 65 70 20 6f   or OP_AggStep o
1950: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
1960: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
1970: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
1980: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
1990: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
19a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
19b0: 67 65 72 20 2a 70 4d 61 78 53 74 61 63 6b 20 69  ger *pMaxStack i
19c0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78  s set to the max
19d0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76  imum number of v
19e0: 64 62 65 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74  dbe stack.** ent
19f0: 72 69 65 73 20 74 68 61 74 20 73 74 61 74 69 63  ries that static
1a00: 20 61 6e 61 6c 79 73 69 73 20 72 65 76 65 61 6c   analysis reveal
1a10: 73 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 6d  s this program m
1a20: 69 67 68 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a  ight need..**.**
1a30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
1a40: 73 6f 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c  so does the foll
1a50: 6f 77 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69  owing optimizati
1a60: 6f 6e 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f  on:  It scans fo
1a70: 72 0a 2a 2a 20 48 61 6c 74 20 69 6e 73 74 72 75  r.** Halt instru
1a80: 63 74 69 6f 6e 73 20 77 68 65 72 65 20 50 31 3d  ctions where P1=
1a90: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
1aa0: 4e 54 20 6f 72 20 50 32 3d 3d 4f 45 5f 41 62 6f  NT or P2==OE_Abo
1ab0: 72 74 20 6f 72 20 66 6f 72 0a 2a 2a 20 49 64 78  rt or for.** Idx
1ac0: 49 6e 73 65 72 74 20 69 6e 73 74 72 75 63 74 69  Insert instructi
1ad0: 6f 6e 73 20 77 68 65 72 65 20 50 32 21 3d 30 2e  ons where P2!=0.
1ae0: 20 20 49 66 20 6e 6f 20 73 75 63 68 20 69 6e 73    If no such ins
1af0: 74 72 75 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 66  truction is.** f
1b00: 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65 72 79  ound, then every
1b10: 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73 74 72   Statement instr
1b20: 75 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65  uction is change
1b30: 64 20 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e  d to a Noop.  In
1b40: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 77 65  .** this way, we
1b50: 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e 67 20   avoid creating 
1b60: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1b70: 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63  urnal file unnec
1b80: 65 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61  essarily..*/.sta
1b90: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
1ba0: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
1bb0: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
1bc0: 72 67 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74  rgs, int *pMaxSt
1bd0: 61 63 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ack){.  int i;. 
1be0: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
1bf0: 30 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74 61  0;.  int nMaxSta
1c00: 63 6b 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f  ck = p->nOp;.  O
1c10: 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61  p *pOp;.  int *a
1c20: 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65  Label = p->aLabe
1c30: 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61  l;.  int doesSta
1c40: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d  tementRollback =
1c50: 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61   0;.  int hasSta
1c60: 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b  tementBegin = 0;
1c70: 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f  .  for(pOp=p->aO
1c80: 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69  p, i=p->nOp-1; i
1c90: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29  >=0; i--, pOp++)
1ca0: 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20  {.    u8 opcode 
1cb0: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a  = pOp->opcode;..
1cc0: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
1cd0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f  OP_Function || o
1ce0: 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65  pcode==OP_AggSte
1cf0: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  p ){.      if( p
1d00: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
1d10: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
1d20: 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p2;.    }else 
1d30: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  if( opcode==OP_H
1d40: 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  alt ){.      if(
1d50: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
1d60: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
1d70: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
1d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73   ){.        does
1d90: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1da0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
1db0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1dc0: 6f 64 65 3d 3d 4f 50 5f 49 64 78 49 6e 73 65 72  ode==OP_IdxInser
1dd0: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
1de0: 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20 20 20 20  Op->p2 ){.      
1df0: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1e00: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1e10: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1e20: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  f( opcode==OP_St
1e30: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
1e40: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
1e50: 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  in = 1;.    }.. 
1e60: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50     if( opcodeNoP
1e70: 75 73 68 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20  ush(opcode) ){. 
1e80: 20 20 20 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d       nMaxStack--
1e90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1ea0: 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f   pOp->p2>=0 ) co
1eb0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
1ec0: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
1ed0: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
1ee0: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
1ef0: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
1f00: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
1f10: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
1f20: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
1f30: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
1f40: 4d 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78  MaxArgs;.  *pMax
1f50: 53 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63  Stack = nMaxStac
1f60: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e  k;..  /* If we n
1f70: 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20  ever rollback a 
1f80: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1f90: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74  ction, then stat
1fa0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
1fb0: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1fc0: 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e  needed.  So chan
1fd0: 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74  ge every OP_Stat
1fe0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64  ement.  ** opcod
1ff0: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  e into an OP_Noo
2000: 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61  p.  This avoid a
2010: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2020: 4f 73 2e 78 4f 70 65 6e 45 78 63 6c 75 73 69 76  Os.xOpenExclusiv
2030: 65 28 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63  e().  ** which c
2040: 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 20  an be expensive 
2050: 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d  on some platform
2060: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  s..  */.  if( ha
2070: 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20  sStatementBegin 
2080: 26 26 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e  && !doesStatemen
2090: 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tRollback ){.   
20a0: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
20b0: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
20c0: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
20d0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
20e0: 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d  pcode==OP_Statem
20f0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ent ){.        p
2100: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
2110: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Noop;.      }.  
2120: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2130: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
2140: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
2150: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
2160: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
2170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
2180: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
2190: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
21a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
21b0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
21c0: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
21d0: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
21e0: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
21f0: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
2200: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
2210: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65  urn the.** addre
2220: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
2230: 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e  operation added.
2240: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2250: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62  dbeAddOpList(Vdb
2260: 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56  e *p, int nOp, V
2270: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
2280: 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64  *aOp){.  int add
2290: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  r;.  assert( p->
22a0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
22b0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 73 69  C_INIT );.  resi
22c0: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
22d0: 6e 4f 70 20 2b 20 6e 4f 70 29 3b 0a 20 20 69 66  nOp + nOp);.  if
22e0: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
22f0: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
2300: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
2310: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  ddr = p->nOp;.  
2320: 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20  if( nOp>0 ){.   
2330: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
2340: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
2350: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
2360: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
2370: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
2380: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
2390: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
23a0: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
23b0: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
23c0: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
23d0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
23e0: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
23f0: 70 31 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p1;.      pOut->
2400: 70 32 20 3d 20 70 32 3c 30 20 3f 20 61 64 64 72  p2 = p2<0 ? addr
2410: 20 2b 20 41 44 44 52 28 70 32 29 20 3a 20 70 32   + ADDR(p2) : p2
2420: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  ;.      pOut->p3
2430: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20   = pIn->p3;.    
2440: 20 20 70 4f 75 74 2d 3e 70 33 74 79 70 65 20 3d    pOut->p3type =
2450: 20 70 49 6e 2d 3e 70 33 20 3f 20 50 33 5f 53 54   pIn->p3 ? P3_ST
2460: 41 54 49 43 20 3a 20 50 33 5f 4e 4f 54 55 53 45  ATIC : P3_NOTUSE
2470: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
2480: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28  _DEBUG.      if(
2490: 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64   sqlite3_vdbe_ad
24a0: 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a 20 20 20  dop_trace ){.   
24b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24c0: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
24d0: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
24e0: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
24f0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
2500: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2520: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2530: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2540: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
2550: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
2560: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2570: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2580: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
2590: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
25a0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
25b0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
25c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
25d0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
25e0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
25f0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
2600: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
2610: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2620: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
2630: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2640: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2650: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2660: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2670: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2680: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2690: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
26a0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
26b0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
26c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
26d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
26e0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
26f0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
2700: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
2710: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
2720: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
2730: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
2740: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2750: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
2760: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2770: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2780: 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73   val>=0 );.  ass
2790: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
27a0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
27b0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64  ;.  if( p && add
27c0: 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61  r>=0 && p->nOp>a
27d0: 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ddr && p->aOp ){
27e0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
27f0: 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p2 = val;.  }.
2800: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2810: 74 65 68 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  teh P2 operand o
2820: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
2830: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
2840: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
2850: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2860: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2870: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
2880: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
2890: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
28a0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
28b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
28c0: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
28d0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  p);.}../*.** Del
28e0: 65 74 65 20 61 20 50 33 20 76 61 6c 75 65 20 69  ete a P3 value i
28f0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
2900: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2910: 50 33 28 69 6e 74 20 70 33 74 79 70 65 2c 20 76  P3(int p3type, v
2920: 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69 66 28 20  oid *p3){.  if( 
2930: 70 33 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  p3 ){.    switch
2940: 28 20 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p3type ){.    
2950: 20 20 63 61 73 65 20 50 33 5f 44 59 4e 41 4d 49    case P3_DYNAMI
2960: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 33  C:.      case P3
2970: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
2980: 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  case P3_KEYINFO_
2990: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
29a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 33     sqliteFree(p3
29b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
29c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29d0: 63 61 73 65 20 50 33 5f 56 44 42 45 46 55 4e 43  case P3_VDBEFUNC
29e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
29f0: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20  Func *pVdbeFunc 
2a00: 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33  = (VdbeFunc *)p3
2a10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2a20: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
2a30: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
2a40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2a50: 46 72 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b  Free(pVdbeFunc);
2a60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
2a80: 73 65 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P3_MEM: {.   
2a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
2aa0: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
2ab0: 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20  alue*)p3);.     
2ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ad0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
2ae0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2af0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33   value of the P3
2b00: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
2b10: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
2b20: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
2b30: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
2b40: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
2b50: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
2b60: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
2b70: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
2b80: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
2b90: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
2ba0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
2bb0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
2bc0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
2bd0: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
2be0: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20  e P3 operand is 
2bf0: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
2c00: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
2c10: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
2c20: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
2c30: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
2c40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a  sqliteMalloc()..
2c50: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
2c60: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
2c70: 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f  tes of zP3 up to
2c80: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
2c90: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
2ca0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
2cb0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
2cc0: 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a  es of zP3..**.**
2cd0: 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46   If n==P3_KEYINF
2ce0: 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  O it means that 
2cf0: 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72  zP3 is a pointer
2d00: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
2d10: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f  ructure..** A co
2d20: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
2d30: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
2d40: 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ure into memory 
2d50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
2d60: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2c 20 74   sqliteMalloc, t
2d70: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
2d80: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
2d90: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f  lized..** n==P3_
2da0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
2db0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
2dc0: 50 33 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P3 points to a K
2dd0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2de0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
2df0: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
2e00: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
2e10: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
2e20: 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c  loc. The .** cal
2e30: 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66  ler should not f
2e40: 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ree the allocati
2e50: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66  on, it will be f
2e60: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
2e70: 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a  be is.** finaliz
2e80: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  ed..** .** Other
2e90: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 33   values of n (P3
2ea0: 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f 4c 4c  _STATIC, P3_COLL
2eb0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
2ec0: 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f 69 6e  te that zP3 poin
2ed0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
2ee0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
2ef0: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
2f00: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
2f10: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
2f20: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
2f30: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
2f40: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
2f50: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
2f60: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
2f70: 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d  ange P3 on the m
2f80: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
2f90: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
2fa0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2fb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
2fc0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2fd0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
2fe0: 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  3, int n){.  Op 
2ff0: 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  *pOp;.  assert( 
3000: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3010: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3020: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  f( p==0 || p->aO
3030: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65  p==0 ){.    free
3040: 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  P3(n, (void*)*(c
3050: 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20  har**)&zP3);.   
3060: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
3070: 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64  f( addr<0 || add
3080: 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  r>=p->nOp ){.   
3090: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
30a0: 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72   1;.    if( addr
30b0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  <0 ) return;.  }
30c0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
30d0: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 33  [addr];.  freeP3
30e0: 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f  (pOp->p3type, pO
30f0: 70 2d 3e 70 33 29 3b 0a 20 20 70 4f 70 2d 3e 70  p->p3);.  pOp->p
3100: 33 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 33  3 = 0;.  if( zP3
3110: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
3120: 70 33 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  p3 = 0;.    pOp-
3130: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  >p3type = P3_NOT
3140: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
3150: 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20  ( n==P3_KEYINFO 
3160: 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
3170: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e  pKeyInfo;.    in
3180: 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b  t nField, nByte;
3190: 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f  ..    /* KeyInfo
31a0: 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
31b0: 20 69 6e 63 6c 75 64 65 20 61 6e 20 4b 65 79 49   include an KeyI
31c0: 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 61  nfo.aSortOrder a
31d0: 72 65 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  re always.    **
31e0: 20 73 65 6e 74 20 69 6e 20 75 73 69 6e 67 20 50   sent in using P
31f0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
3200: 46 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 2e  F.  The KeyInfo.
3210: 61 53 6f 72 74 4f 72 64 65 72 20 61 72 72 61 79  aSortOrder array
3220: 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  .    ** is not d
3230: 75 70 6c 69 63 61 74 65 64 20 77 68 65 6e 20 50  uplicated when P
3240: 33 5f 4b 45 59 49 4e 46 4f 20 69 73 20 75 73 65  3_KEYINFO is use
3250: 64 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 61 73 73  d. */.    /* ass
3260: 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
3270: 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 3b 20  SortOrder==0 ); 
3280: 2a 2f 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20  */.    nField = 
3290: 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 33 29 2d  ((KeyInfo*)zP3)-
32a0: 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79  >nField;.    nBy
32b0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65  te = sizeof(*pKe
32c0: 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64  yInfo) + (nField
32d0: 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49  -1)*sizeof(pKeyI
32e0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 3b 0a  nfo->aColl[0]);.
32f0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
3300: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3310: 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70  nByte );.    pOp
3320: 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b  ->p3 = (char*)pK
3330: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
3340: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
3350: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
3360: 6f 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a  o, zP3, nByte);.
3370: 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70        pOp->p3typ
3380: 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P3_KEYINFO;.
3390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33a0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
33b0: 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d  3_NOTUSED;.    }
33c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
33d0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
33e0: 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  FF ){.    pOp->p
33f0: 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a  3 = (char*)zP3;.
3400: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
3410: 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P3_KEYINFO;.  
3420: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3430: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28  .    pOp->p3 = (
3440: 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70  char*)zP3;.    p
3450: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a  Op->p3type = n;.
3460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3470: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c   n==0 ) n = strl
3480: 65 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f 70  en(zP3);.    pOp
3490: 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72  ->p3 = sqliteStr
34a0: 4e 44 75 70 28 7a 50 33 2c 20 6e 29 3b 0a 20 20  NDup(zP3, n);.  
34b0: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
34c0: 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a  P3_DYNAMIC;.  }.
34d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
34e0: 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  G./*.** Replace 
34f0: 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20  the P3 field of 
3500: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3510: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
3520: 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d 6d  ion with.** comm
3530: 65 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69  ent text..*/.voi
3540: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
3550: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
3560: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
3570: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
3580: 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28  st ap;.  assert(
3590: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
35a0: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
35b0: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
35c0: 70 2d 31 5d 2e 70 33 3d 3d 30 20 29 3b 0a 20 20  p-1].p3==0 );.  
35d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
35e0: 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  rmat);.  sqlite3
35f0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20  VdbeChangeP3(p, 
3600: 2d 31 2c 20 73 71 6c 69 74 65 33 56 4d 50 72 69  -1, sqlite3VMPri
3610: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
3620: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
3630: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23   va_end(ap);.}.#
3640: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
3650: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
3660: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
3670: 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ss..*/.VdbeOp *s
3680: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
3690: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
36a0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  r){.  assert( p-
36b0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
36c0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
36d0: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20  ert( addr>=0 && 
36e0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
36f0: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
3700: 61 64 64 72 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64  addr];.}..#if !d
3710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3720: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
3730: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
3740: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
3750: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
3760: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3770: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
3780: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
3790: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
37a0: 68 65 20 50 33 20 70 61 72 61 6d 65 74 65 72 20  he P3 parameter 
37b0: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
37c0: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
37d0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
37e0: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
37f0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
3800: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 33 28 4f  har *displayP3(O
3810: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
3820: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
3830: 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20  .  char *zP3;.  
3840: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
3850: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
3860: 4f 70 2d 3e 70 33 74 79 70 65 20 29 7b 0a 20 20  Op->p3type ){.  
3870: 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46    case P3_KEYINF
3880: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
3890: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
38a0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28  fo *pKeyInfo = (
38b0: 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33  KeyInfo*)pOp->p3
38c0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
38d0: 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28  zTemp, "keyinfo(
38e0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
38f0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
3900: 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b  = strlen(zTemp);
3910: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3920: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
3930: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
3940: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
3950: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
3960: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
3970: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
3980: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
3990: 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  rlen(pColl->zNam
39a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
39b0: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
39c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
39d0: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c  cpy(&zTemp[i],",
39e0: 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ...");.         
39f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3a10: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
3a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3a30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3a40: 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f  rder && pKeyInfo
3a50: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
3a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
3a70: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
3a80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3a90: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
3aa0: 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e  Temp[i], pColl->
3ab0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
3ac0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
3ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c    }else if( i+4<
3ae0: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
3af0: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 54 65       strcpy(&zTe
3b00: 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29 3b 0a 20  mp[i],",nil");. 
3b10: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
3b20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3b30: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69   }.      zTemp[i
3b40: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20  ++] = ')';.     
3b50: 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20   zTemp[i] = 0;. 
3b60: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
3b70: 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 7a 50  Temp );.      zP
3b80: 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  3 = zTemp;.     
3b90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3ba0: 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45    case P3_COLLSE
3bb0: 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  Q: {.      CollS
3bc0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
3bd0: 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20  lSeq*)pOp->p3;. 
3be0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65       sprintf(zTe
3bf0: 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32  mp, "collseq(%.2
3c00: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
3c10: 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d  me);.      zP3 =
3c20: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72   zTemp;.      br
3c30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3c40: 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20  ase P3_FUNCDEF: 
3c50: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
3c60: 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66  *pDef = (FuncDef
3c70: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
3c80: 20 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a   char zNum[30];.
3c90: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54        sprintf(zT
3ca0: 65 6d 70 2c 20 22 25 2e 2a 73 22 2c 20 6e 54 65  emp, "%.*s", nTe
3cb0: 6d 70 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29  mp, pDef->zName)
3cc0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
3cd0: 7a 4e 75 6d 2c 22 28 25 64 29 22 2c 20 70 44 65  zNum,"(%d)", pDe
3ce0: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
3cf0: 69 66 28 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70  if( strlen(zTemp
3d00: 29 2b 73 74 72 6c 65 6e 28 7a 4e 75 6d 29 2b 31  )+strlen(zNum)+1
3d10: 3c 3d 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  <=nTemp ){.     
3d20: 20 20 20 73 74 72 63 61 74 28 7a 54 65 6d 70 2c     strcat(zTemp,
3d30: 20 7a 4e 75 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   zNum);.      }.
3d40: 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d        zP3 = zTem
3d50: 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
3d60: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
3d70: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d  t: {.      zP3 =
3d80: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
3d90: 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f  if( zP3==0 || pO
3da0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f  p->opcode==OP_No
3db0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  op ){.        zP
3dc0: 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a  3 = "";.      }.
3dd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3de0: 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP3;.}.#endif
3df0: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  ...#if defined(V
3e00: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
3e10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
3e20: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
3e30: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
3e40: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3e50: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
3e60: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
3e70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3e80: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
3e90: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
3ea0: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
3eb0: 33 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  3;.  char zPtr[5
3ec0: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
3ed0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
3ee0: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
3ef0: 34 64 20 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20  4d %4d %s\n";.  
3f00: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
3f10: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
3f20: 50 33 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70  P3 = displayP3(p
3f30: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
3f40: 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e  (zPtr));.  fprin
3f50: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
3f60: 31 2c 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c  1,.      pc, sql
3f70: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b  ite3OpcodeNames[
3f80: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f  pOp->opcode], pO
3f90: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
3fa0: 7a 50 33 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  zP3);.  fflush(p
3fb0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
3fc0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
3fd0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
3fe0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
3ff0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
4000: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
4010: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
4020: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  ){.    while( N-
4030: 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->0 ){.      sql
4040: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
4050: 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20  se(p++);.    }. 
4060: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
4070: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
4080: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
4090: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
40a0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
40b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
40c0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
40d0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
40e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
40f0: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
4100: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
4110: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
4120: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
4130: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
4140: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4150: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
4160: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
4170: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69   "EXPLAIN"..*/.i
4180: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
4190: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
41c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
41d0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  = p->db;.  int i
41e0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
41f0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
4200: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
4210: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
4220: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
4230: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
4240: 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74  MISUSE;.  assert
4250: 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c  ( db->magic==SQL
4260: 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29  ITE_MAGIC_BUSY )
4270: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
4280: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
4290: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
42a0: 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  SY );..  /* Even
42b0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
42c0: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 75 74  ode does not put
42d0: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
42e0: 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   onto the.  ** t
42f0: 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79 20 6d  he stack, they m
4300: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
4310: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
4320: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
4330: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
4340: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
4350: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
4360: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
4370: 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d 3d  .  if( p->pTos==
4380: 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29 7b  &p->aStack[4] ){
4390: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
43a0: 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20  rray(p->aStack, 
43b0: 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65 73  5);.  }.  p->res
43c0: 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20 20  OnStack = 0;..  
43d0: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
43e0: 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  c++;.  }while( i
43f0: 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78  <p->nOp && p->ex
4400: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
4410: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
4420: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
4430: 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ( i>=p->nOp ){. 
4440: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
4450: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
4460: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
4470: 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  lse if( db->flag
4480: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
4490: 72 75 70 74 20 29 7b 0a 20 20 20 20 64 62 2d 3e  rupt ){.    db->
44a0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
44b0: 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20 20 20 20  _Interrupt;.    
44c0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
44d0: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
44e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
44f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
4500: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
4510: 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  g, sqlite3ErrStr
4520: 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29  (p->rc), (char*)
4530: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
4540: 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61   Op *pOp = &p->a
4550: 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a  Op[i];.    Mem *
4560: 70 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b  pMem = p->aStack
4570: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
4580: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
4590: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
45a0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
45b0: 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b 20 20    pMem->i = i;  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
45e0: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
45f0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
4600: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
4610: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
4620: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
4630: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71      pMem->z = sq
4640: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73  lite3OpcodeNames
4650: 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20  [pOp->opcode];  
4660: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
4670: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
4680: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
4690: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
46a0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
46b0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
46c0: 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d 2b  _UTF8;.    pMem+
46d0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
46e0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
46f0: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70     pMem->i = pOp
4700: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4720: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
4730: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
4740: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
4750: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
4760: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
4770: 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70  .    pMem->i = p
4780: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
47b0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
47c0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
47d0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
47e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 68  ->flags = MEM_Sh
47f0: 6f 72 74 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  ort|MEM_Str|MEM_
4800: 54 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f  Term;   /* P3 */
4810: 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64  .    pMem->z = d
4820: 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d  isplayP3(pOp, pM
4830: 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65  em->zShort, size
4840: 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29  of(pMem->zShort)
4850: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  );.    pMem->typ
4860: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
4870: 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
4880: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20   SQLITE_UTF8;.. 
4890: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
48a0: 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70   = 5 - 2*(p->exp
48b0: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
48c0: 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  pTos = pMem;.   
48d0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
48e0: 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e  OK;.    p->resOn
48f0: 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72  Stack = 1;.    r
4900: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
4910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4920: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
4930: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
4940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74   */../*.** Print
4950: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
4960: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
4970: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
4980: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
4990: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
49a0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  dbe *p){.#ifdef 
49b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
49c0: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
49d0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
49e0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
49f0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
4a00: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
4a10: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
4a20: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
4a30: 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  >p3!=0 ){.    co
4a40: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
4a50: 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c 65  p->p3;.    while
4a60: 28 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29  ( isspace(*(u8*)
4a70: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72  z) ) z++;.    pr
4a80: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
4a90: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64  n", z);.  }.#end
4aa0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
4ab0: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
4ac0: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
4ad0: 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ion.  This invol
4ae0: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
4af0: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
4b00: 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64   stack space and
4b10: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
4b20: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
4b30: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
4b40: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
4b50: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
4b60: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
4b70: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
4b80: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
4b90: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
4ba0: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  is is the only w
4bb0: 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42  ay to move a VDB
4bc0: 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  E from VDBE_MAGI
4bd0: 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42  C_INIT to.** VDB
4be0: 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a  E_MAGIC_RUN..*/.
4bf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4c00: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
4c10: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4c30: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  he VDBE */.  int
4c40: 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20   nVar,          
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4c60: 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65  umber of '?' see
4c70: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74   in the SQL stat
4c80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
4c90: 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Mem,            
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4cb0: 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ber of memory ce
4cc0: 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  lls to allocate 
4cd0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
4ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4cf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d00: 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f   cursors to allo
4d10: 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  cate */.  int is
4d20: 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20  Explain         
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4d40: 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20   if the EXPLAIN 
4d50: 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73  keywords is pres
4d60: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
4d70: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  n;..  assert( p!
4d80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4d90: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4da0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
4db0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
4dc0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
4dd0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
4de0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4df0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
4e00: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
4e10: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
4e20: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
4e30: 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20  r. This.   * is 
4e40: 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
4e50: 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61   to resizeOpArra
4e60: 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68  y() below may sh
4e70: 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d  rink the.   * p-
4e80: 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20  >aOp[] array to 
4e90: 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63  save memory if c
4ea0: 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44  alled when in VD
4eb0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20  BE_MAGIC_RUN .  
4ec0: 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a   * state..   */.
4ed0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
4ee0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
4ef0: 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f  /* No instructio
4f00: 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f  n ever pushes mo
4f10: 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65  re than a single
4f20: 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68   element onto th
4f30: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41  e.  ** stack.  A
4f40: 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76  nd the stack nev
4f50: 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63  er grows on succ
4f60: 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e  essive execution
4f70: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61  s of the.  ** sa
4f80: 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65  me loop.  So the
4f90: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
4fa0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73   instructions is
4fb0: 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a   an upper bound.
4fc0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69    ** on the maxi
4fd0: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20  mum stack depth 
4fe0: 72 65 71 75 69 72 65 64 2e 20 20 28 41 64 64 65  required.  (Adde
4ff0: 64 20 6c 61 74 65 72 3a 29 20 20 54 68 65 0a 20  d later:)  The. 
5000: 20 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56 61 6c   ** resolveP2Val
5010: 75 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75  ues() call compu
5020: 74 65 73 20 61 20 74 69 67 68 74 65 72 20 75 70  tes a tighter up
5030: 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
5040: 0a 20 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65  .  ** stack size
5050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  **.  ** Allo
5060: 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73  cation all the s
5070: 74 61 63 6b 20 73 70 61 63 65 20 77 65 20 77 69  tack space we wi
5080: 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20  ll ever need..  
5090: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61  */.  if( p->aSta
50a0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ck==0 ){.    int
50b0: 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a 20   nArg;       /* 
50c0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
50d0: 66 20 61 72 67 73 20 70 61 73 73 65 64 20 74 6f  f args passed to
50e0: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
50f0: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74  . */.    int nSt
5100: 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69  ack;     /* Maxi
5110: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74  mum number of st
5120: 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65 71 75  ack entries requ
5130: 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f  ired */.    reso
5140: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
5150: 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a  nArg, &nStack);.
5160: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
5170: 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  y(p, p->nOp);.  
5180: 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d    assert( nVar>=
5190: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
51a0: 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29   nStack<p->nOp )
51b0: 3b 0a 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 69  ;.    nStack = i
51c0: 73 45 78 70 6c 61 69 6e 20 3f 20 31 30 20 3a 20  sExplain ? 10 : 
51d0: 6e 53 74 61 63 6b 3b 0a 20 20 20 20 70 2d 3e 61  nStack;.    p->a
51e0: 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61  Stack = sqliteMa
51f0: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 6e 53  lloc(.        nS
5200: 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  tack*sizeof(p->a
5210: 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20  Stack[0])    /* 
5220: 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20  aStack */.      
5230: 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  + nArg*sizeof(Me
5240: 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  m*)             
5250: 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20   /* apArg */.   
5260: 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66     + nVar*sizeof
5270: 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20  (Mem)           
5280: 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20      /* aVar */. 
5290: 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65       + nVar*size
52a0: 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20  of(char*)       
52b0: 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a        /* azVar *
52c0: 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73  /.      + nMem*s
52d0: 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20  izeof(Mem)      
52e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
52f0: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72   */.      + nCur
5300: 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f  sor*sizeof(Curso
5310: 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61 70  r*)        /* ap
5320: 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20  Csr */.    );.  
5330: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d    if( !sqlite3_m
5340: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
5350: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20        p->aMem = 
5360: 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63  &p->aStack[nStac
5370: 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65  k];.      p->nMe
5380: 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  m = nMem;.      
5390: 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d  p->aVar = &p->aM
53a0: 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20  em[nMem];.      
53b0: 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a  p->nVar = nVar;.
53c0: 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d        p->okVar =
53d0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41   0;.      p->apA
53e0: 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e  rg = (Mem**)&p->
53f0: 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  aVar[nVar];.    
5400: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68    p->azVar = (ch
5410: 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e  ar**)&p->apArg[n
5420: 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Arg];.      p->a
5430: 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a  pCsr = (Cursor**
5440: 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d  )&p->azVar[nVar]
5450: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73  ;.      p->nCurs
5460: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
5470: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
5480: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
5490: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
54a0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
54b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
54c0: 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70  }.  for(n=0; n<p
54d0: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
54e0: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
54f0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
5500: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
5510: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28 70  E_DEBUG.  if( (p
5520: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
5530: 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67  LITE_VdbeListing
5540: 29 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c 69  )!=0.    || sqli
5550: 74 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73 74  te3Os.xFileExist
5560: 73 28 22 76 64 62 65 5f 65 78 70 6c 61 69 6e 22  s("vdbe_explain"
5570: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ).  ){.    int i
5580: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56 44  ;.    printf("VD
5590: 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69  BE Program Listi
55a0: 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ng:\n");.    sql
55b0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
55c0: 28 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (p);.    for(i=0
55d0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
55e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
55f0: 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75  dbePrintOp(stdou
5600: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
5610: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
5620: 66 28 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 69  f( sqlite3Os.xFi
5630: 6c 65 45 78 69 73 74 73 28 22 76 64 62 65 5f 74  leExists("vdbe_t
5640: 72 61 63 65 22 29 20 29 7b 0a 20 20 20 20 70 2d  race") ){.    p-
5650: 3e 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b  >trace = stdout;
5660: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
5670: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
5680: 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20  ck[-1];.  p->pc 
5690: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
56a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
56b0: 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20  uniqueCnt = 0;. 
56c0: 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20   p->returnDepth 
56d0: 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  = 0;.  p->errorA
56e0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
56f0: 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20  ;.  p->popStack 
5700: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
5710: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
5720: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
5730: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
5740: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
5750: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
5760: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ILE.  {.    int 
5770: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
5780: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
5790: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
57a0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
57b0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
57c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
57d0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
57e0: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e  lose a cursor an
57f0: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
5800: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
5810: 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a   cursor happens.
5820: 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ** to hold..*/.v
5830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
5840: 72 65 65 43 75 72 73 6f 72 28 43 75 72 73 6f 72  reeCursor(Cursor
5850: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
5860: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
5870: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
5880: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
5890: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
58a0: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
58b0: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  Cursor);.  }.  i
58c0: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
58d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
58e0: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
58f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
5900: 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pCx->pData);.  
5910: 73 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e  sqliteFree(pCx->
5920: 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  aType);.  sqlite
5930: 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a  Free(pCx);.}../*
5940: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
5950: 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20  rsors.*/.static 
5960: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
5970: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
5980: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
5990: 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75  >apCsr==0 ) retu
59a0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
59b0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
59c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
59d0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
59e0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20 70  apCsr[i]);.    p
59f0: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
5a00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
5a10: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
5a20: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a  er execution..**
5a30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5a40: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
5a50: 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75  lly close any cu
5a60: 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e  rsors, lists, an
5a70: 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20  d/or.** sorters 
5a80: 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f  that were left o
5a90: 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65  pen.  It also de
5aa0: 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73  letes the values
5ab0: 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73   of.** variables
5ac0: 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61   in the aVar[] a
5ad0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
5ae0: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
5af0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
5b00: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20    if( p->aStack 
5b10: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
5b20: 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b  mArray(p->aStack
5b30: 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d  , 1 + (p->pTos -
5b40: 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20   p->aStack));.  
5b50: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e    p->pTos = &p->
5b60: 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a  aStack[-1];.  }.
5b70: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
5b80: 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  s(p);.  releaseM
5b90: 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
5ba0: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c   p->nMem);.  sql
5bb0: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
5bc0: 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20  r(&p->sFifo);.  
5bd0: 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  if( p->contextSt
5be0: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ack ){.    for(i
5bf0: 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74  =0; i<p->context
5c00: 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a  StackTop; i++){.
5c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5c20: 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63  eFifoClear(&p->c
5c30: 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73  ontextStack[i].s
5c40: 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Fifo);.    }.   
5c50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 63   sqliteFree(p->c
5c60: 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20  ontextStack);.  
5c70: 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  }.  p->contextSt
5c80: 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  ack = 0;.  p->co
5c90: 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20  ntextStackDepth 
5ca0: 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78  = 0;.  p->contex
5cb0: 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20  tStackTop = 0;. 
5cc0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
5cd0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
5ce0: 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rrMsg = 0;.}../*
5cf0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
5d00: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
5d10: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
5d20: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
5d30: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
5d40: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
5d50: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
5d60: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
5d70: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
5d80: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
5d90: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
5da0: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
5db0: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
5dc0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
5dd0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
5de0: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
5df0: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
5e00: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
5e10: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
5e20: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
5e30: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
5e40: 69 6e 74 20 6e 3b 0a 20 20 72 65 6c 65 61 73 65  int n;.  release
5e50: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
5e60: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
5e70: 75 6d 6e 2a 32 29 3b 0a 20 20 73 71 6c 69 74 65  umn*2);.  sqlite
5e80: 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  Free(p->aColName
5e90: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
5ea0: 75 6d 6e 2a 32 3b 0a 20 20 70 2d 3e 6e 52 65 73  umn*2;.  p->nRes
5eb0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c  Column = nResCol
5ec0: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
5ed0: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
5ee0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  (Mem*)sqliteMall
5ef0: 6f 63 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  oc( sizeof(Mem)*
5f00: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
5f10: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
5f20: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
5f30: 20 3e 20 30 20 29 7b 0a 20 20 20 20 28 70 43 6f   > 0 ){.    (pCo
5f40: 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20  lName++)->flags 
5f50: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a  = MEM_Null;.  }.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5f70: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
5f80: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
5f90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
5fa0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
5fb0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
5fc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
5fd0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
5fe0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
5ff0: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
6000: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
6010: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
6020: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
6030: 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54  ** If N==P3_STAT
6040: 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61  IC  it means tha
6050: 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69  t zName is a poi
6060: 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61  nter to a consta
6070: 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72  nt static.** str
6080: 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a  ing and we can j
6090: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
60a0: 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50  nter. If it is P
60b0: 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  3_DYNAMIC, then 
60c0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
60d0: 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  s freed using sq
60e0: 6c 69 74 65 46 72 65 65 28 29 20 77 68 65 6e 20  liteFree() when 
60f0: 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e 69  the vdbe is fini
6100: 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e  shed with.** it.
6110: 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79   Otherwise, N by
6120: 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65  tes of zName are
6130: 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20   copied..*/.int 
6140: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6150: 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69  lName(Vdbe *p, i
6160: 6e 74 20 69 64 78 2c 20 63 6f 6e 73 74 20 63 68  nt idx, const ch
6170: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
6180: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
6190: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
61a0: 61 73 73 65 72 74 28 20 69 64 78 3c 28 32 2a 70  assert( idx<(2*p
61b0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29 3b  ->nResColumn) );
61c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
61d0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
61e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
61f0: 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  EM;.  assert( p-
6200: 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
6210: 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
6220: 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 5d 29  ->aColName[idx])
6230: 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59  ;.  if( N==P3_DY
6240: 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53  NAMIC || N==P3_S
6250: 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20  TATIC ){.    rc 
6260: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
6270: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
6280: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
6290: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
62a0: 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
62b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
62c0: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
62d0: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
62e0: 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   N, SQLITE_UTF8,
62f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
6300: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d  =SQLITE_OK && N=
6320: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P3_DYNAMIC ){. 
6330: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
6340: 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  gs = (pColName->
6350: 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74  flags&(~MEM_Stat
6360: 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20  ic))|MEM_Dyn;.  
6370: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c    pColName->xDel
6380: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
6390: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
63a0: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
63b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
63c0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
63d0: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
63e0: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
63f0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
6400: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
6410: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
6420: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
6430: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
6440: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
6450: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
6460: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
6470: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
6480: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6490: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
64a0: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
64b0: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
64c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
64d0: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
64e0: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
64f0: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
6500: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
6510: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
6520: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6530: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
6540: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
6550: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6560: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
6570: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
6580: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
6590: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
65a0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
65b0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
65c0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
65d0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
65e0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
65f0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
6600: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
6610: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
6620: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
6630: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
6640: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
6650: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
6660: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  k ){.    int rc;
6670: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
6680: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
6690: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
66a0: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
66b0: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  mitArg);.    sql
66c0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
66d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
66e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
66f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
6700: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6710: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
6720: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
6730: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
6740: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
6750: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
6760: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
6770: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
6780: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
6790: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
67a0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
67b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
67c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
67d0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
67e0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
67f0: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
6800: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
6810: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
6820: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
6830: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  .  In that case 
6840: 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73  we do.  ** not s
6850: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
6860: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
6870: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d  , so use the sim
6880: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20  ple case then.  
6890: 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ** too..  */.  i
68a0: 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c  f( 0==strlen(sql
68b0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
68c0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
68d0: 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c  pBt)) || nTrans<
68e0: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =1 ){.    for(i=
68f0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
6900: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
6910: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
6920: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
6930: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
6940: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
6950: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6960: 72 65 65 53 79 6e 63 28 70 42 74 2c 20 30 29 3b  reeSync(pBt, 0);
6970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6980: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
6990: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
69a0: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
69b0: 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 20 2a  ssfully synced *
69c0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
69d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
69e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
69f0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
6a00: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
6a10: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
6a20: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 20          if( pBt 
6a30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6a40: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
6a50: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
6a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6a70: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
6a80: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
6a90: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
6aa0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6ab0: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
6ac0: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
6ad0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6ae0: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
6af0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
6b00: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
6b10: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
6b20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6b30: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
6b40: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  {.    int needSy
6b50: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
6b60: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
6b70: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
6b80: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
6b90: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
6ba0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
6bb0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
6bc0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
6bd0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
6be0: 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20   OsFile *master 
6bf0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  = 0;..    /* Sel
6c00: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
6c10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
6c20: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
6c30: 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20   u32 random;.   
6c40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
6c50: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
6c60: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
6c70: 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20  sizeof(random), 
6c80: 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  &random);.      
6c90: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
6ca0: 33 4d 50 72 69 6e 74 66 28 22 25 73 2d 6d 6a 25  3MPrintf("%s-mj%
6cb0: 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c  08X", zMainFile,
6cc0: 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66   random&0x7fffff
6cd0: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ff);.      if( !
6ce0: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  zMaster ){.     
6cf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6d00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
6d10: 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69      }while( sqli
6d20: 74 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73 74  te3Os.xFileExist
6d30: 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a 0a 20  s(zMaster) );.. 
6d40: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
6d50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
6d60: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
6d70: 65 33 4f 73 2e 78 4f 70 65 6e 45 78 63 6c 75 73  e3Os.xOpenExclus
6d80: 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  ive(zMaster, &ma
6d90: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  ster, 0);.    if
6da0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6db0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
6dc0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
6dd0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6de0: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
6df0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
6e00: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
6e10: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
6e20: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
6e30: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
6e40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6e50: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6e60: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
6e70: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
6e80: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
6e90: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
6ea0: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
6eb0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
6ec0: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
6ed0: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
6ee0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6ef0: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
6f00: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
6f10: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
6f20: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
6f30: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
6f40: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6f50: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
6f60: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
6f70: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
6f80: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
6f90: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
6fa0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
6fb0: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
6fc0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26        if( pBt &&
6fd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
6fe0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
6ff0: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
7000: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
7010: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
7020: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
7030: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d      if( zFile[0]
7040: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==0 ) continue; 
7050: 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f   /* Ignore :memo
7060: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
7070: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
7080: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
7090: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
70a0: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
70b0: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
70c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
70d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
70e0: 65 33 4f 73 57 72 69 74 65 28 6d 61 73 74 65 72  e3OsWrite(master
70f0: 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28  , zFile, strlen(
7100: 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20  zFile)+1);.     
7110: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7120: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7130: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7140: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
7150: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78       sqlite3Os.x
7160: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
7170: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7180: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
7190: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
71a0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
71b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20       }.    }... 
71c0: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
71d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
71e0: 6c 65 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  le. Before doing
71f0: 20 74 68 69 73 2c 20 6f 70 65 6e 20 74 68 65 20   this, open the 
7200: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 2a 2a  directory.    **
7210: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7220: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 74 6f 72  nal file is stor
7230: 65 20 69 6e 20 73 6f 20 74 68 61 74 20 69 74 20  e in so that it 
7240: 67 65 74 73 20 73 79 6e 63 65 64 20 74 6f 6f 2e  gets synced too.
7250: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69  .    */.    zMai
7260: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
7270: 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64  treeGetDirname(d
7280: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
7290: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
72a0: 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
72b0: 6d 61 73 74 65 72 2c 20 7a 4d 61 69 6e 46 69 6c  master, zMainFil
72c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
72d0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
72e0: 20 20 20 20 20 20 20 28 6e 65 65 64 53 79 6e 63         (needSync
72f0: 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f   && (rc=sqlite3O
7300: 73 53 79 6e 63 28 6d 61 73 74 65 72 2c 30 29 29  sSync(master,0))
7310: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  !=SQLITE_OK) ){.
7320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
7330: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
7340: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78       sqlite3Os.x
7350: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
7360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7370: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7380: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7390: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
73a0: 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
73b0: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
73c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
73d0: 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
73e0: 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
73f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
7400: 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
7410: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
7420: 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
7430: 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
7440: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
7450: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7460: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
7470: 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
7480: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
7490: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
74a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
74b0: 63 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  c(),.    ** then
74c0: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
74d0: 63 65 20 74 68 61 74 20 74 68 65 20 6d 61 73 74  ce that the mast
74e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
74f0: 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f  will be.    ** o
7500: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
7510: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
7520: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  , in case the ma
7530: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ster journal.   
7540: 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 20 77 61   ** file name wa
7550: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
7560: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7570: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
7580: 72 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 65  re.    ** occure
7590: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
75a0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
75b0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
75c0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
75d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
75e0: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
75f0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
7600: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
7610: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
7620: 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20 7a 4d  treeSync(pBt, zM
7630: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
7640: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7650: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
7660: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d  qlite3OsClose(&m
7670: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
7680: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
7690: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
76a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
76b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
76c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
76d0: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
76e0: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
76f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7700: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
7710: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
7720: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
7730: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
7740: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
7750: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
7760: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
7770: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
7780: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
7790: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
77a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
77b0: 4f 73 2e 78 44 65 6c 65 74 65 28 7a 4d 61 73 74  Os.xDelete(zMast
77c0: 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
77d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
77e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
77f0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a  (zMaster);.    z
7800: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
7810: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 2e 78  rc = sqlite3Os.x
7820: 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 7a 4d  SyncDirectory(zM
7830: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
7840: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7850: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
7860: 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e 20 54 68   is not good. Th
7870: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7880: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 64   file has been d
7890: 65 6c 65 74 65 64 2c 20 62 75 74 0a 20 20 20 20  eleted, but.    
78a0: 20 20 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f    ** the directo
78b0: 72 79 20 73 79 6e 63 20 66 61 69 6c 65 64 2e 20  ry sync failed. 
78c0: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70  There is no comp
78d0: 6c 65 74 65 6c 79 20 73 61 66 65 20 63 6f 75 72  letely safe cour
78e0: 73 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  se of.      ** a
78f0: 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65 72 65 2e  ction from here.
7900: 20 54 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   The individual 
7910: 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74 61 69 6e  journals contain
7920: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7930: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  .      ** master
7940: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 62   journal file, b
7950: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
7960: 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 69 66  ay of knowing if
7970: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d   that.      ** m
7980: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
7990: 69 73 74 73 20 6e 6f 77 20 6f 72 20 69 66 20 69  ists now or if i
79a0: 74 20 77 69 6c 6c 20 65 78 69 73 74 20 61 66 74  t will exist aft
79b0: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  er the operating
79c0: 0a 20 20 20 20 20 20 2a 2a 20 73 79 73 74 65 6d  .      ** system
79d0: 20 63 72 61 73 68 20 74 68 61 74 20 6d 61 79 20   crash that may 
79e0: 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73 79 6e 63  follow the fsync
79f0: 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 20 20  () failure..    
7a00: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
7a10: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
7a20: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
7a30: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
7a40: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
7a50: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
7a60: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
7a70: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
7a80: 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 61 72  BtreeCommit() ar
7a90: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
7aa0: 69 6c 65 73 20 61 6e 64 20 64 65 6c 65 74 69 6e  iles and deletin
7ab0: 67 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  g.    ** journal
7ac0: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
7ad0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
7ae0: 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
7af0: 6e 67 20 77 65 20 64 6f 6e 27 74 0a 20 20 20 20  ng we don't.    
7b00: 2a 2a 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  ** really care. 
7b10: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
7b20: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7b30: 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
7b40: 61 6e 74 65 65 64 2c 0a 20 20 20 20 2a 2a 20 62  anteed,.    ** b
7b50: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
7b60: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 20 6d 61  old' journals ma
7b70: 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
7b80: 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 0a  d. Returning an.
7b90: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
7ba0: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
7bb0: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
7bc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
7bd0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
7be0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7bf0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7c00: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
7c10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
7c20: 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b  treeCommit(pBt);
7c30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7c40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
7c50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7c60: 20 46 69 6e 64 20 65 76 65 72 79 20 61 63 74 69   Find every acti
7c70: 76 65 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e  ve VM other than
7c80: 20 70 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67   pVdbe and chang
7c90: 65 20 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a  e its status to.
7ca0: 2a 2a 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69  ** aborted.  Thi
7cb0: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f  s happens when o
7cc0: 6e 65 20 56 4d 20 63 61 75 73 65 73 20 61 20 72  ne VM causes a r
7cd0: 6f 6c 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61  ollback due to a
7ce0: 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  n.** ON CONFLICT
7cf0: 20 52 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65   ROLLBACK clause
7d00: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20   (for example). 
7d10: 20 54 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d   The other VMs m
7d20: 75 73 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65  ust be.** aborte
7d30: 64 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 64  d so that they d
7d40: 6f 20 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20  o not have data 
7d50: 72 6f 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20  rolled out from 
7d60: 75 6e 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68  underneath.** th
7d70: 65 6d 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20  em leading to a 
7d80: 73 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61  segfault..*/.sta
7d90: 74 69 63 20 76 6f 69 64 20 61 62 6f 72 74 4f 74  tic void abortOt
7da0: 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28 56  herActiveVdbes(V
7db0: 64 62 65 20 2a 70 56 64 62 65 29 7b 0a 20 20 56  dbe *pVdbe){.  V
7dc0: 64 62 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66  dbe *pOther;.  f
7dd0: 6f 72 28 70 4f 74 68 65 72 3d 70 56 64 62 65 2d  or(pOther=pVdbe-
7de0: 3e 64 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68  >db->pVdbe; pOth
7df0: 65 72 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65  er; pOther=pOthe
7e00: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
7e10: 66 28 20 70 4f 74 68 65 72 3d 3d 70 56 64 62 65  f( pOther==pVdbe
7e20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7e30: 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67   if( pOther->mag
7e40: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
7e50: 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63  UN || pOther->pc
7e60: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
7e70: 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f     closeAllCurso
7e80: 72 73 28 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  rs(pOther);.    
7e90: 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64 20  pOther->aborted 
7ea0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  = 1;.  }.}../* .
7eb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7ec0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
7ed0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
7ee0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
7ef0: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
7f00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
7f10: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
7f20: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
7f30: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
7f40: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
7f50: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
7f60: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
7f70: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
7f80: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
7f90: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
7fa0: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
7fb0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
7fc0: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
7fd0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
7fe0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
7ff0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
8000: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
8010: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
8020: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
8030: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8040: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
8050: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  cnt = 0;.  p = d
8060: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
8070: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
8080: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
8090: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
80a0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
80b0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t++;.    }.    p
80c0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
80d0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
80e0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
80f0: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
8100: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
8110: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
8120: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
8130: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8140: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
8150: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
8160: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
8170: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
8180: 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
8190: 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
81a0: 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
81b0: 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
81c0: 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
81d0: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
81e0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
81f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
8200: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
8210: 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
8220: 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
8230: 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
8240: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
8250: 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ALT..**.** Retur
8260: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
8270: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
8280: 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
8290: 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
82a0: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
82b0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
82c0: 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
82d0: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
82e0: 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
82f0: 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
8300: 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
8310: 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
8320: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8330: 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
8340: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8350: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
8360: 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63  i;.  int (*xFunc
8370: 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20  )(Btree *pBt) = 
8380: 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  0;  /* Function 
8390: 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20  to call on each 
83a0: 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f  btree backend */
83b0: 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ..  if( p->magic
83c0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
83d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61   ){.    /* Alrea
83e0: 64 79 20 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68  dy halted.  Noth
83f0: 69 6e 67 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  ing to do. */.  
8400: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
8410: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
8420: 41 4c 54 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ALT );.    retur
8430: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8440: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
8450: 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63  rs(p);.  checkAc
8460: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
8470: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3c 30 20 29  .  if( p->pc<0 )
8480: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  {.    /* No comm
8490: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
84a0: 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
84b0: 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
84c0: 65 64 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ed */.  }else if
84d0: 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
84e0: 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64   && db->activeVd
84f0: 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  beCnt==1 ){.    
8500: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8510: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
8520: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
8530: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
8540: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
8550: 20 69 73 20 74 72 75 65 2c 20 74 68 65 72 65 20   is true, there 
8560: 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 61 63 74  are no other act
8570: 69 76 65 20 71 75 65 72 69 65 73 0a 20 20 20 20  ive queries.    
8580: 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 69 73 20    ** using this 
8590: 68 61 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76  handle and the v
85a0: 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
85b0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69  successful or hi
85c0: 74 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 27 4f  t an.      ** 'O
85d0: 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
85e0: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  nt. This means a
85f0: 20 63 6f 6d 6d 69 74 20 69 73 20 72 65 71 75 69   commit is requi
8600: 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
8610: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62      int rc = vdb
8620: 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  eCommit(db);.   
8630: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8640: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
8650: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8660: 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BUSY;.      }els
8670: 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
8680: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
8690: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
86a0: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
86b0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b  e3BtreeRollback;
86c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
86d0: 73 65 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20  se{.      xFunc 
86e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
86f0: 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  llback;.    }.  
8700: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
8710: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8720: 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
8730: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
8740: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
8750: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
8760: 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  mt;.    }else if
8770: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
8780: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
8790: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
87a0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
87b0: 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Stmt;.    }else{
87c0: 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73  .      xFunc = s
87d0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
87e0: 61 63 6b 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61  ack;.      db->a
87f0: 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
8800: 20 20 20 20 20 61 62 6f 72 74 4f 74 68 65 72 41       abortOtherA
8810: 63 74 69 76 65 56 64 62 65 73 28 70 29 3b 0a 20  ctiveVdbes(p);. 
8820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
8830: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
8840: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
8850: 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  one of sqlite3Bt
8860: 72 65 65 52 6f 6c 6c 62 61 63 6b 2c 0a 20 20 2a  reeRollback,.  *
8870: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  * sqlite3BtreeRo
8880: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 20 73 71  llbackStmt or sq
8890: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
88a0: 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e  Stmt. Call it on
88b0: 63 65 20 6f 6e 0a 20 20 2a 2a 20 65 61 63 68 20  ce on.  ** each 
88c0: 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65  backend. If an e
88d0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
88e0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
88f0: 69 73 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 53 51  is still.  ** SQ
8900: 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65  LITE_OK, set the
8910: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
8920: 74 68 65 20 6e 65 77 20 65 72 72 6f 72 20 76 61  the new error va
8930: 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  lue..  */.  for(
8940: 69 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c  i=0; xFunc && i<
8950: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
8960: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
8970: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8980: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8990: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
89a0: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
89b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
89c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
89d0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
89e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
89f0: 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
8a00: 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
8a10: 45 54 45 2c 20 73 65 74 20 74 68 65 20 63 68 61  ETE, set the cha
8a20: 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a  nge counter. */.
8a30: 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
8a40: 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  ntOn && p->pc>=0
8a50: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 78 46 75   ){.    if( !xFu
8a60: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
8a70: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
8a80: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tmt ){.      sql
8a90: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
8aa0: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
8ab0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
8ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ad0: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
8ae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
8af0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 7d  nChange = 0;.  }
8b00: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
8b10: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
8b20: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
8b30: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
8b40: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
8b50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
8b60: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  ite3RollbackInte
8b70: 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
8b80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
8b90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8ba0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
8bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d  .    sqlite3Comm
8bc0: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
8bd0: 73 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  s(db);.  }..  /*
8be0: 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
8bf0: 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
8c00: 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
8c10: 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
8c20: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
8c30: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
8c40: 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b  activeVdbeCnt--;
8c50: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
8c60: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
8c70: 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
8c80: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
8c90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
8cb0: 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
8cc0: 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
8cd0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
8ce0: 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
8cf0: 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
8d00: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
8d10: 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
8d20: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
8d30: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
8d40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8d50: 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
8d60: 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
8d70: 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
8d80: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
8d90: 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
8da0: 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
8db0: 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
8dc0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
8dd0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
8de0: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
8df0: 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
8e00: 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
8e10: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
8e20: 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
8e30: 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
8e40: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d   *p){.  if( p->m
8e50: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
8e60: 5f 52 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63  _RUN && p->magic
8e70: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  !=VDBE_MAGIC_HAL
8e80: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
8e90: 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c  Error(p->db, SQL
8ea0: 49 54 45 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a  ITE_MISUSE, 0);.
8eb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8ec0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20  E_MISUSE;.  }.. 
8ed0: 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
8ee0: 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
8ef0: 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
8f00: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
8f10: 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
8f20: 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
8f30: 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
8f40: 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
8f50: 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
8f60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
8f70: 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
8f80: 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
8f90: 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
8fa0: 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
8fb0: 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
8fc0: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
8fd0: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
8fe0: 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
8ff0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
9000: 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
9010: 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
9020: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
9030: 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
9040: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
9050: 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
9060: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
9070: 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
9080: 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
9090: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
90a0: 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
90b0: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
90c0: 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73     if( p->zErrMs
90d0: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
90e0: 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70  e3Error(p->db, p
90f0: 2d 3e 72 63 2c 20 22 25 73 22 2c 20 70 2d 3e 7a  ->rc, "%s", p->z
9100: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
9110: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72  qliteFree(p->zEr
9120: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rMsg);.      p->
9130: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
9140: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
9150: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9160: 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d  3Error(p->db, p-
9170: 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  >rc, 0);.    }el
9180: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9190: 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51  3Error(p->db, SQ
91a0: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20  LITE_OK, 0);.   
91b0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
91c0: 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
91d0: 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
91e0: 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
91f0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
9200: 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
9210: 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
9220: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
9230: 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
9240: 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
9250: 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
9260: 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
9270: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
9280: 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
9290: 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
92a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
92b0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30  (p->db, p->rc, 0
92c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  );.  }..  /* Rec
92d0: 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
92e0: 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
92f0: 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
9300: 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
9310: 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
9320: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
9330: 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20  DBE run..  */.  
9340: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c  assert( p->pTos<
9350: 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63  &p->aStack[p->pc
9360: 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 73  <0?0:p->pc] || s
9370: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
9380: 69 6c 65 64 3d 3d 31 20 29 3b 0a 23 69 66 64 65  iled==1 );.#ifde
9390: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
93a0: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
93b0: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
93c0: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
93d0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
93e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
93f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
9400: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
9410: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
9420: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
9430: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
9440: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
9450: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
9460: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
9470: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
9480: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
9490: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
94a0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
94b0: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
94c0: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
94d0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
94e0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
94f0: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
9500: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
9510: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
9520: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
9530: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
9540: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
9550: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
9560: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
9570: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
9580: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
9590: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
95a0: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
95b0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
95c0: 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d  ;.  p->aborted =
95d0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
95e0: 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29  =SQLITE_SCHEMA )
95f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
9600: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
9610: 28 70 2d 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  (p->db, 0);.  }.
9620: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
9630: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
9640: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
9650: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
9660: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
9670: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
9680: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
9690: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
96a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
96b0: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
96c0: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
96d0: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
96e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
96f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
9700: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
9710: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
9720: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
9730: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
9740: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
9750: 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 7d  dbeReset(p);.  }
9760: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69  else if( p->magi
9770: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
9780: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
9790: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
97a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
97b0: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
97c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
97d0: 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
97e0: 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
97f0: 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
9800: 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
9810: 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
9820: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
9830: 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
9840: 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
9850: 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
9860: 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
9870: 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
9880: 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
9890: 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
98a0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
98b0: 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
98c0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
98d0: 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
98e0: 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
98f0: 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
9900: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
9910: 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
9920: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
9930: 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
9940: 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
9950: 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
9960: 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31  >31 || !(mask&(1
9970: 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
9980: 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
9990: 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
99a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
99b0: 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
99c0: 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
99d0: 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
99e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
99f0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
9a00: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
9a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9a20: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
9a30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
9a40: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
9a50: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20    Cleanup(p);.  
9a60: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
9a70: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
9a80: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
9a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
9aa0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
9ab0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
9ac0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
9ad0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
9ae0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
9af0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
9b00: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
9b10: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
9b20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
9b30: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
9b40: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e    Op *pOp = &p->
9b50: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72  aOp[i];.      fr
9b60: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
9b70: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  , pOp->p3);.    
9b80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
9b90: 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20  (p->aOp);.  }.  
9ba0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
9bb0: 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
9bc0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
9bd0: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
9be0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61  liteFree(p->aSta
9bf0: 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ck);.  releaseMe
9c00: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
9c10: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
9c20: 6e 2a 32 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  n*2);.  sqliteFr
9c30: 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  ee(p->aColName);
9c40: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
9c50: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
9c60: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
9c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  }../*.** If a Mo
9c80: 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
9c90: 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
9ca0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
9cb0: 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
9cc0: 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75  oveTo now.  Retu
9cd0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
9ce0: 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20  .  If no MoveTo 
9cf0: 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73  is pending, this
9d00: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  .** routine does
9d10: 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74   nothing and ret
9d20: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
9d30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
9d40: 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43  beCursorMoveto(C
9d50: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
9d60: 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
9d70: 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  to ){.    int re
9d80: 73 2c 20 72 63 3b 0a 20 20 20 20 65 78 74 65 72  s, rc;.    exter
9d90: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
9da0: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20  arch_count;.    
9db0: 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
9dc0: 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  le );.    if( p-
9dd0: 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  >isTable ){.    
9de0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
9df0: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
9e00: 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
9e10: 74 6f 54 61 72 67 65 74 2c 20 26 72 65 73 29 3b  toTarget, &res);
9e20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9e30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
9e40: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
9e50: 72 73 6f 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e  rsor,(char*)&p->
9e60: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20  movetoTarget,.  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
9e90: 6f 66 28 69 36 34 29 2c 26 72 65 73 29 3b 0a 20  of(i64),&res);. 
9ea0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
9eb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
9ec0: 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20   *p->pIncrKey = 
9ed0: 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  0;.    p->lastRo
9ee0: 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70  wid = keyToInt(p
9ef0: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b  ->movetoTarget);
9f00: 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56  .    p->rowidIsV
9f10: 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20  alid = res==0;. 
9f20: 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
9f30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9f40: 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70  e3BtreeNext(p->p
9f50: 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
9f60: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
9f70: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9f80: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
9f90: 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70  h_count++;.    p
9fa0: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
9fb0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
9fc0: 68 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  heValid = 0;.  }
9fd0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9fe0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
9ff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
a000: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
a010: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
a020: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
a030: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
a040: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
a050: 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a  eSerialRead().**
a060: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
a070: 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
a080: 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74  e3VdbeSerialWrit
a090: 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  e().**.** encaps
a0a0: 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
a0b0: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
a0c0: 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
a0d0: 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
a0e0: 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
a0f0: 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
a100: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
a110: 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
a120: 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
a130: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
a140: 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
a150: 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
a160: 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
a170: 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
a180: 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
a190: 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
a1a0: 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
a1b0: 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
a1c0: 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
a1d0: 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
a1e0: 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
a1f0: 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
a200: 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
a210: 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
a220: 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
a230: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
a240: 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
a250: 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
a260: 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
a270: 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
a280: 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
a290: 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
a2a0: 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
a2b0: 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
a2c0: 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
a2d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a2e0: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
a2f0: 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
a300: 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
a310: 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
a320: 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
a330: 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
a340: 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
a360: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
a370: 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
a380: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
a3b0: 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
a3e0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
a3f0: 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
a410: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
a420: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
a430: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
a440: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
a450: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
a460: 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
a490: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
a4a0: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
a4c0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
a4d0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
a4e0: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
a4f0: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
a500: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
a510: 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
a540: 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 38  E float.**     8
a550: 2d 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  -11             
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
a580: 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
a590: 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
a5a0: 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
a5b0: 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
a5c0: 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
a5d0: 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
a5e0: 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a       text.**.*/.
a5f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a600: 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
a610: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
a620: 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
a630: 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
a640: 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
a650: 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  em){.  int flags
a660: 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
a670: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
a680: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
a690: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
a6a0: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
a6b0: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
a6c0: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
a6d0: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
a6e0: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
a6f0: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
a700: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
a710: 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  1000)<<32)-1).  
a720: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
a730: 69 3b 0a 20 20 20 20 75 36 34 20 75 20 3d 20 69  i;.    u64 u = i
a740: 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20  <0 ? -i : i;.   
a750: 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65   if( u<=127 ) re
a760: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
a770: 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
a780: 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
a790: 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
a7a0: 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
a7b0: 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
a7c0: 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
a7d0: 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
a7e0: 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
a7f0: 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
a800: 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
a810: 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
a820: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
a830: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e  EM_Str ){.    in
a840: 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  t n = pMem->n;. 
a850: 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20     assert( n>=0 
a860: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
a870: 6e 2a 32 29 20 2b 20 31 33 29 3b 0a 20 20 7d 0a  n*2) + 13);.  }.
a880: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
a890: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65 74 75  Blob ){.    retu
a8a0: 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20  rn (pMem->n*2 + 
a8b0: 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  12);.  }.  retur
a8c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
a8d0: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
a8e0: 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
a8f0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
a900: 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
a910: 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -type..*/.int sq
a920: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
a930: 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
a940: 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
a950: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
a960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
a970: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
a980: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
a990: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
a9a0: 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
a9b0: 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
a9c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
a9d0: 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
a9e0: 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
a9f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74   }.}../*.** Writ
aa00: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
aa10: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
aa20: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
aa30: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
aa40: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
aa50: 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
aa60: 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
aa70: 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
aa80: 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
aa90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
aaa0: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69  s written..*/ .i
aab0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
aac0: 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65 64  rialPut(unsigned
aad0: 20 63 68 61 72 20 2a 62 75 66 2c 20 4d 65 6d 20   char *buf, Mem 
aae0: 2a 70 4d 65 6d 29 7b 0a 20 20 75 33 32 20 73 65  *pMem){.  u32 se
aaf0: 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
ab00: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
ab10: 65 28 70 4d 65 6d 29 3b 0a 20 20 69 6e 74 20 6c  e(pMem);.  int l
ab20: 65 6e 3b 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a  en;..  /* NULL *
ab30: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
ab40: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ype==0 ){.    re
ab50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 0a 20 20  turn 0;.  }. .  
ab60: 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
ab70: 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
ab80: 69 61 6c 5f 74 79 70 65 3c 3d 37 20 29 7b 0a 20  ial_type<=7 ){. 
ab90: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
aba0: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
abb0: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
abc0: 20 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29       v = *(u64*)
abd0: 26 70 4d 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65  &pMem->r;.    }e
abe0: 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a  lse{.      v = *
abf0: 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a  (u64*)&pMem->i;.
ac00: 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
ac10: 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
ac20: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
ac30: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 77  ial_type);.    w
ac40: 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20  hile( i-- ){.   
ac50: 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30     buf[i] = (v&0
ac60: 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
ac70: 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
ac80: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 20  eturn len;.  }. 
ac90: 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72   .  /* String or
aca0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73 65 72   blob */.  asser
acb0: 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  t( serial_type>=
acc0: 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  12 );.  len = sq
acd0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
ace0: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
acf0: 70 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 62 75  pe);.  memcpy(bu
ad00: 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
ad10: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a  ;.  return len;.
ad20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
ad30: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
ad40: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
ad50: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
ad60: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
ad70: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
ad80: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
ad90: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
ada0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
adb0: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
adc0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
add0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
ade0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
adf0: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
ae00: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
ae10: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
ae20: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
ae30: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
ae40: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
ae50: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
ae80: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
ae90: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
aea0: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
aeb0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 38 3a  e ){.    case 8:
aec0: 20 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20      /* Reserved 
aed0: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
aee0: 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 20 20  /.    case 9:   
aef0: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
af00: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
af10: 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
af20: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
af30: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
af40: 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
af50: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
af60: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
af70: 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
af80: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
af90: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
afa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
afb0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
afc0: 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
afd0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
afe0: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 73      pMem->i = (s
aff0: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
b000: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
b010: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
b020: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b030: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
b040: 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
b050: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
b060: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
b070: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
b080: 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
b090: 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [1];.      pMem-
b0a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b0b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
b0c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b0d0: 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
b0e0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
b0f0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20  /.      pMem->i 
b100: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
b110: 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
b120: 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
b130: 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
b140: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
b150: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
b160: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
b170: 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
b180: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
b190: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  */.      pMem->i
b1a0: 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
b1b0: 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
b1c0: 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
b1d0: 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[3];.      pMe
b1e0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
b1f0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
b200: 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
b210: 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
b220: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
b230: 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20   */.      u64 x 
b240: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
b250: 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
b260: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32  uf[1];.      u32
b270: 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34   y = (buf[2]<<24
b280: 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29  ) | (buf[3]<<16)
b290: 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c   | (buf[4]<<8) |
b2a0: 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78   buf[5];.      x
b2b0: 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
b2c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
b2d0: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
b2e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
b2f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
b300: 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
b310: 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
b320: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
b330: 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
b340: 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
b350: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
b360: 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
b370: 20 20 20 75 33 32 20 79 3b 0a 23 69 66 6e 64 65     u32 y;.#ifnde
b380: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 2f  f NDEBUG.      /
b390: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
b3a0: 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
b3b0: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
b3c0: 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
b3d0: 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
b3e0: 72 2e 20 20 54 68 65 20 62 79 74 65 20 6f 72 64  r.  The byte ord
b3f0: 65 72 20 64 69 66 66 65 72 73 20 6f 6e 20 73 6f  er differs on so
b400: 6d 65 20 28 62 72 6f 6b 65 6e 29 20 61 72 63 68  me (broken) arch
b410: 69 74 65 63 74 75 72 65 73 2e 0a 20 20 20 20 20  itectures..     
b420: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
b430: 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
b440: 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
b450: 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 61 73 73  )<<32;.      ass
b460: 65 72 74 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62  ert( 1.0==*(doub
b470: 6c 65 2a 29 26 74 31 20 29 3b 0a 23 65 6e 64 69  le*)&t1 );.#endi
b480: 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
b490: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
b4a0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
b4b0: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
b4c0: 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
b4d0: 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
b4e0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
b4f0: 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
b500: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
b510: 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
b520: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
b530: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
b540: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
b550: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
b560: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
b570: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b580: 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64     pMem->r = *(d
b590: 6f 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20  ouble*)&x;.     
b5a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
b5b0: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
b5c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
b5d0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  8;.    }.    def
b5e0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
b5f0: 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
b600: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
b610: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
b620: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
b630: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
b640: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
b650: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
b660: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
b670: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
b680: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
b690: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
b6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b6b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b6c0: 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
b6d0: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
b6e0: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
b6f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b700: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
b710: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
b720: 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
b730: 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
b740: 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66  x records specif
b750: 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79  ied by .** {nKey
b760: 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e  1, pKey1} and {n
b770: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65  Key2, pKey2}, re
b780: 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69  turning a negati
b790: 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
b7a0: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
b7b0: 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
b7c0: 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
b7d0: 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
b7e0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b  greater than {nK
b7f0: 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f  ey2, pKey2}.  Bo
b800: 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  th Key1 and Key2
b810: 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74   must be byte st
b820: 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65  rings.** compose
b830: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
b840: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
b850: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e   the VDBE..*/.in
b860: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
b870: 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  ordCompare(.  vo
b880: 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20  id *userData,.  
b890: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
b8a0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
b8b0: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
b8c0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
b8d0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
b8e0: 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a  Info = (KeyInfo*
b8f0: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32  )userData;.  u32
b900: 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20   d1, d2;        
b910: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
b920: 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
b930: 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
b940: 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32    u32 idx1, idx2
b950: 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  ;      /* Offset
b960: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
b970: 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
b980: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
b990: 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a  dr1, szHdr2;  /*
b9a0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
b9b0: 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
b9c0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
b9d0: 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
b9e0: 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
b9f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
ba00: 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
ba10: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
ba20: 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  y1;.  const unsi
ba30: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32  gned char *aKey2
ba40: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
ba50: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b  ed char *)pKey2;
ba60: 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20  ..  Mem mem1;.  
ba70: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31  Mem mem2;.  mem1
ba80: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
ba90: 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63  >enc;.  mem2.enc
baa0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
bab0: 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 73 71  ;.  .  idx1 = sq
bac0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
bad0: 28 70 4b 65 79 31 2c 20 26 73 7a 48 64 72 31 29  (pKey1, &szHdr1)
bae0: 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
baf0: 0a 20 20 69 64 78 32 20 3d 20 73 71 6c 69 74 65  .  idx2 = sqlite
bb00: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b 65  3GetVarint32(pKe
bb10: 79 32 2c 20 26 73 7a 48 64 72 32 29 3b 0a 20 20  y2, &szHdr2);.  
bb20: 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e  d2 = szHdr2;.  n
bb30: 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
bb40: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
bb50: 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
bb60: 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b  & idx2<szHdr2 ){
bb70: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
bb80: 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73  type1;.    u32 s
bb90: 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20  erial_type2;..  
bba0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
bbb0: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
bbc0: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
bbd0: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
bbe0: 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
bbf0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  te3GetVarint32(&
bc00: 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 26 73 65  aKey1[idx1], &se
bc10: 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20  rial_type1);.   
bc20: 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
bc30: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
bc40: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
bc50: 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
bc60: 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20  ak;.    idx2 += 
bc70: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
bc80: 33 32 28 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c  32(&aKey2[idx2],
bc90: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3b   &serial_type2);
bca0: 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65  .    if( d2>=nKe
bcb0: 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y2 && sqlite3Vdb
bcc0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
bcd0: 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29  erial_type2)>0 )
bce0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
bcf0: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 72  Assert that ther
bd00: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
bd10: 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68 20 6b  e left in each k
bd20: 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20  ey for the blob 
bd30: 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 74  of.    ** data t
bd40: 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20 73 65  o go with the se
bd50: 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74 20 72  rial type just r
bd60: 65 61 64 2e 20 54 68 69 73 20 61 73 73 65 72 74  ead. This assert
bd70: 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 20 20   may fail if.   
bd80: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20   ** the file is 
bd90: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 6e  corrupted.  Then
bda0: 20 72 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   read the value 
bdb0: 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 69 6e  from each key in
bdc0: 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61  to mem1.    ** a
bdd0: 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63 74 69  nd mem2 respecti
bde0: 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vely..    */.   
bdf0: 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
be00: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
be10: 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
be20: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
be30: 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56    d2 += sqlite3V
be40: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
be50: 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f  ey2[d2], serial_
be60: 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a  type2, &mem2);..
be70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
be80: 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
be90: 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c  , &mem2, i<nFiel
bea0: 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
beb0: 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
bec0: 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20   if( mem1.flags 
bed0: 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  & MEM_Dyn ) sqli
bee0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
bef0: 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66  e(&mem1);.    if
bf00: 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d  ( mem2.flags & M
bf10: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
bf20: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
bf30: 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72  mem2);.    if( r
bf40: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
bf50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
bf60: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  ++;.  }..  /* On
bf70: 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
bf80: 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
bf90: 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
bfa0: 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
bfb0: 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
bfc0: 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
bfd0: 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
bfe0: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
bff0: 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
c000: 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
c010: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
c020: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
c030: 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
c040: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
c050: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c060: 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  d1<nKey1 ){.    
c070: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
c080: 6c 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32  lse if( d2<nKey2
c090: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d   ){.      rc = -
c0a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
c0b0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
c0c0: 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b  ortOrder && i<pK
c0d0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 26  eyInfo->nField &
c0e0: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
c0f0: 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
c100: 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a   rc = -rc;.  }..
c110: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c120: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
c130: 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65  nt is an index e
c140: 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73  ntry composed us
c150: 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
c160: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
c170: 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   The last entry 
c180: 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20 73  in this record s
c190: 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
c1a0: 67 65 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c  ger (specificall
c1b0: 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  y.** an integer 
c1c0: 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f  rowid).  This ro
c1d0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
c1e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
c1f0: 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74  s in.** that int
c200: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
c210: 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
c220: 4c 65 6e 28 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  Len(int nKey, co
c230: 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
c240: 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
c250: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
c260: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
c270: 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
c280: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
c290: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a  f the rowid */..
c2a0: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
c2b0: 6e 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64  nt32(aKey, &szHd
c2c0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
c2d0: 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
c2e0: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
c2f0: 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
c300: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
c310: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
c320: 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  d);.}.  ../*.** 
c330: 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
c340: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
c350: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
c360: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
c370: 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
c380: 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
c390: 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
c3a0: 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
c3b0: 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
c3c0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
c3d0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
c3e0: 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
c3f0: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
c400: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
c410: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
c420: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
c430: 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
c440: 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e  4 nCellKey;.  in
c450: 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
c460: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
c470: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
c480: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
c490: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
c4a0: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
c4b0: 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
c4c0: 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
c4d0: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
c4e0: 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
c4f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
c500: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
c510: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
c520: 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
c530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c540: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
c550: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
c560: 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
c570: 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
c580: 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
c590: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
c5a0: 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   rc;.  }.  sqlit
c5b0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 6d 2e  e3GetVarint32(m.
c5c0: 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71  z, &szHdr);.  sq
c5d0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
c5e0: 28 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20  (&m.z[szHdr-1], 
c5f0: 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c  &typeRowid);.  l
c600: 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
c610: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
c620: 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  en(typeRowid);. 
c630: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c640: 61 6c 47 65 74 28 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  alGet(&m.z[m.n-l
c650: 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
c660: 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
c670: 69 64 20 3d 20 76 2e 69 3b 0a 20 20 73 71 6c 69  id = v.i;.  sqli
c680: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
c690: 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
c6a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c6b0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
c6c0: 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
c6d0: 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
c6e0: 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74  or pC is point t
c6f0: 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
c700: 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
c710: 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e  Key (of length n
c720: 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74  Key).  Write int
c730: 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
c740: 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
c750: 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
c760: 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
c770: 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
c780: 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
c790: 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20  ter than pKey.  
c7a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c7b0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
c7c0: 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68 65  ** pKey is eithe
c7d0: 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
c7e0: 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
c7f0: 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
c800: 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
c810: 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
c820: 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
c830: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c840: 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
c850: 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
c860: 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ll..*/.int sqlit
c870: 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
c880: 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70  are(.  Cursor *p
c890: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
c8a0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
c8b0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
c8c0: 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  nst */.  int nKe
c8d0: 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65  y, const u8 *pKe
c8e0: 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  y,   /* The key 
c8f0: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
c900: 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
c910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
c920: 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
c930: 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
c940: 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
c950: 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lKey;.  int rc;.
c960: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
c970: 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
c980: 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a    int lenRowid;.
c990: 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69    Mem m;..  sqli
c9a0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
c9b0: 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
c9c0: 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
c9d0: 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  <=0 ){.    *res 
c9e0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
c9f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
ca00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
ca10: 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
ca20: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43  ->pCursor, 0, nC
ca30: 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
ca40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ca50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
ca60: 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
ca70: 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
ca80: 65 6e 28 6d 2e 6e 2c 20 6d 2e 7a 29 3b 0a 20 20  en(m.n, m.z);.  
ca90: 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
caa0: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
cab0: 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e  pC->pKeyInfo, m.
cac0: 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c  n-lenRowid, m.z,
cad0: 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
cae0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
caf0: 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
cb00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cb10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
cb20: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
cb30: 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
cb40: 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
cb50: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
cb60: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
cb70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
cb80: 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
cb90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
cba0: 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
cbb0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
cbc0: 6e 67 65 29 7b 0a 20 20 64 62 2d 3e 6e 43 68 61  nge){.  db->nCha
cbd0: 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
cbe0: 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
cbf0: 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
cc00: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
cc10: 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
cc20: 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
cc30: 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
cc40: 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
cc50: 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
cc60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
cc70: 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
cc80: 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
cc90: 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
cca0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
ccb0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ccc0: 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
ccd0: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
cce0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
ccf0: 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
cd00: 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
cd10: 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
cd20: 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
cd30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
cd40: 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
cd50: 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
cd60: 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
cd70: 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
cd80: 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
cd90: 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
cda0: 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
cdb0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
cdc0: 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
cdd0: 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
cde0: 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
cdf0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
ce00: 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
ce10: 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
ce20: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
ce30: 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
ce40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
ce50: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
ce60: 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
ce70: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
ce80: 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
ce90: 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
cea0: 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
ceb0: 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
cec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
ced0: 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
cee0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
cef0: 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
cf00: 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
cf10: 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
cf20: 6e 20 76 2d 3e 64 62 3b 0a 7d 0a                 n v->db;.}.