/ Hex Artifact Content
Login

Artifact e7c116d4b14868d5fe570e361c6872839b6ab07a:


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 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
0aa0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
0ab0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
0ac0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
0ad0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
0ae0: 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d   op;.  pOp->p1 =
0af0: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
0b00: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
0b10: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 33 74 79 70   0;.  pOp->p3typ
0b20: 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a  e = P3_NOTUSED;.
0b30: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
0b40: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0b50: 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69  DEBUG.  if( sqli
0b60: 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
0b70: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0b80: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0b90: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0ba0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
0bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
0bc0: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
0bd0: 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c 75  udes the p3 valu
0be0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
0bf0: 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a 70  3VdbeOp3(Vdbe *p
0c00: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0c10: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
0c20: 63 68 61 72 20 2a 7a 50 33 2c 69 6e 74 20 70 33  char *zP3,int p3
0c30: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  type){.  int add
0c40: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
0c50: 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31 2c 20  ddOp(p, op, p1, 
0c60: 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2);.  sqlite3Vd
0c70: 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 61 64  beChangeP3(p, ad
0c80: 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70 65 29  dr, zP3, p3type)
0c90: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
0cb0: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
0cc0: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
0cd0: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
0ce0: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
0cf0: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
0d00: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
0d10: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
0d20: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
0d30: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
0d40: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
0d50: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
0d60: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
0d70: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
0d80: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
0d90: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
0da0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
0db0: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
0dc0: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
0dd0: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
0de0: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
0df0: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
0e00: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
0e10: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
0e20: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
0e30: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
0e40: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
0e50: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
0e60: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
0e70: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
0e80: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
0e90: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
0ea0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
0eb0: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
0ec0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
0ed0: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
0ee0: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
0ef0: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
0f00: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
0f10: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  c() fails..*/.in
0f20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
0f30: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b  eLabel(Vdbe *p){
0f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
0f50: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
0f60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
0f70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
0f80: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
0f90: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20  nLabelAlloc ){. 
0fa0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
0fb0: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
0fc0: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 73  oc*2 + 10;.    s
0fd0: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46  qlite3ReallocOrF
0fe0: 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 2d 3e  ree((void**)&p->
0ff0: 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  aLabel,.        
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
1020: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
1030: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
1040: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
1050: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1060: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1070: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1080: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1090: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
10a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
10b0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
10c0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
10d0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
10e0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
10f0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1100: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
1110: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
1120: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
1130: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1140: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
1150: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
1160: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1170: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1180: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
11a0: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
11b0: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
11c0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
11d0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
11e0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
11f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1200: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
1210: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
1220: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
1230: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
1240: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
1250: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
1260: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1270: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1280: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1290: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
12a0: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
12b0: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
12c0: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
12d0: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
12e0: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
12f0: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
1300: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
1310: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
1320: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
1330: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
1340: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
1350: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
1360: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1370: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1380: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1390: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
13a0: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
13b0: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
13c0: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
13d0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
13e0: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
13f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
1400: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
1410: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
1420: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
1430: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
1440: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
1450: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
1460: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1470: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1480: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1490: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
14a0: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
14b0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
14c0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
14d0: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
14e0: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
14f0: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1500: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
1510: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
1520: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
1530: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
1540: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
1550: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
1560: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1570: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1580: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1590: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
15a0: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
15b0: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
15c0: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
15d0: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
15e0: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
15f0: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1600: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1610: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1620: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1630: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1640: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1650: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1660: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1670: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1680: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1690: 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 31 3c   (NOPUSH_MASK_1<
16a0: 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48  <16),.    NOPUSH
16b0: 5f 4d 41 53 4b 5f 32 20 2b 20 28 4e 4f 50 55 53  _MASK_2 + (NOPUS
16c0: 48 5f 4d 41 53 4b 5f 33 3c 3c 31 36 29 2c 0a 20  H_MASK_3<<16),. 
16d0: 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 34     NOPUSH_MASK_4
16e0: 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f   + (NOPUSH_MASK_
16f0: 35 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55  5<<16),.    NOPU
1700: 53 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 4e 4f 50  SH_MASK_6 + (NOP
1710: 55 53 48 5f 4d 41 53 4b 5f 37 3c 3c 31 36 29 2c  USH_MASK_7<<16),
1720: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1730: 5f 38 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53  _8 + (NOPUSH_MAS
1740: 4b 5f 39 3c 3c 31 36 29 0a 20 20 7d 3b 0a 20 20  K_9<<16).  };.  
1750: 61 73 73 65 72 74 28 20 6f 70 3c 33 32 2a 35 20  assert( op<32*5 
1760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73  );.  return (mas
1770: 6b 73 5b 6f 70 3e 3e 35 5d 20 26 20 28 31 3c 3c  ks[op>>5] & (1<<
1780: 28 6f 70 26 30 78 31 46 29 29 29 3b 0a 7d 0a 0a  (op&0x1F)));.}..
1790: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
17a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  nt sqlite3VdbeOp
17b0: 63 6f 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70  codeNoPush(u8 op
17c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 63 6f  ){.  return opco
17d0: 64 65 4e 6f 50 75 73 68 28 6f 70 29 3b 0a 7d 0a  deNoPush(op);.}.
17e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
17f0: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  op through the p
1800: 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66  rogram looking f
1810: 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61  or P2 values tha
1820: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
1830: 2a 2a 20 45 61 63 68 20 73 75 63 68 20 76 61 6c  ** Each such val
1840: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20  ue is a label.  
1850: 52 65 73 6f 6c 76 65 20 74 68 65 20 6c 61 62 65  Resolve the labe
1860: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
1870: 20 50 32 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20   P2.** value to 
1880: 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d  its correct non-
1890: 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  zero value..**.*
18a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18b0: 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66  s called once af
18c0: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
18d0: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
18e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ed..**.** Variab
18f0: 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  le *pMaxFuncArgs
1900: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d   is set to the m
1910: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  aximum value of 
1920: 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20  any P2 argument 
1930: 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e  .** to an OP_Fun
1940: 63 74 69 6f 6e 20 6f 72 20 4f 50 5f 41 67 67 53  ction or OP_AggS
1950: 74 65 70 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  tep opcode. This
1960: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
1970: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1980: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
1990: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
19a0: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
19b0: 20 69 6e 74 65 67 65 72 20 2a 70 4d 61 78 53 74   integer *pMaxSt
19c0: 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 74 68  ack is set to th
19d0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
19e0: 20 6f 66 20 76 64 62 65 20 73 74 61 63 6b 0a 2a   of vdbe stack.*
19f0: 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 73  * entries that s
1a00: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 72  tatic analysis r
1a10: 65 76 65 61 6c 73 20 74 68 69 73 20 70 72 6f 67  eveals this prog
1a20: 72 61 6d 20 6d 69 67 68 74 20 6e 65 65 64 2e 0a  ram might need..
1a30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a40: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68 65  ne also does the
1a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6d   following optim
1a60: 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63 61  ization:  It sca
1a70: 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c 74 20 69  ns for.** Halt i
1a80: 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72  nstructions wher
1a90: 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  e P1==SQLITE_CON
1aa0: 53 54 52 41 49 4e 54 20 6f 72 20 50 32 3d 3d 4f  STRAINT or P2==O
1ab0: 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f 72 0a 2a  E_Abort or for.*
1ac0: 2a 20 49 64 78 49 6e 73 65 72 74 20 69 6e 73 74  * IdxInsert inst
1ad0: 72 75 63 74 69 6f 6e 73 20 77 68 65 72 65 20 50  ructions where P
1ae0: 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20 73 75 63  2!=0.  If no suc
1af0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
1b00: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  .** found, then 
1b10: 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74 20  every Statement 
1b20: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 63  instruction is c
1b30: 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f 70  hanged to a Noop
1b40: 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73 20 77 61  .  In.** this wa
1b50: 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65 61  y, we avoid crea
1b60: 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ting the stateme
1b70: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  nt journal file 
1b80: 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e 0a 2a  unnecessarily..*
1b90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1ba0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64  solveP2Values(Vd
1bb0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78  be *p, int *pMax
1bc0: 46 75 6e 63 41 72 67 73 2c 20 69 6e 74 20 2a 70  FuncArgs, int *p
1bd0: 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20 69 6e 74  MaxStack){.  int
1be0: 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72   i;.  int nMaxAr
1bf0: 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4d  gs = 0;.  int nM
1c00: 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e 6e 4f 70  axStack = p->nOp
1c10: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
1c20: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
1c30: 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f  aLabel;.  int do
1c40: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1c50: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ack = 0;.  int h
1c60: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
1c70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 0;.  for(pOp=
1c80: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
1c90: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1ca0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
1cb0: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
1cc0: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
1cd0: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
1ce0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41   || opcode==OP_A
1cf0: 67 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20  ggStep ){.      
1d00: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
1d10: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1d20: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d  = pOp->p2;.    }
1d30: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1d40: 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20  =OP_Halt ){.    
1d50: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53    if( pOp->p1==S
1d60: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1d70: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
1d80: 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
1d90: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1da0: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
1db0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1dc0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ( opcode==OP_Idx
1dd0: 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
1de0: 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a 20  if( pOp->p2 ){. 
1df0: 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65         doesState
1e00: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  mentRollback = 1
1e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e20: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1e30: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  OP_Statement ){.
1e40: 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d 65        hasStateme
1e50: 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20  ntBegin = 1;.   
1e60: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   }..    if( opco
1e70: 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65 29  deNoPush(opcode)
1e80: 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53 74   ){.      nMaxSt
1e90: 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20  ack--;.    }..  
1ea0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d 30    if( pOp->p2>=0
1eb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ec0: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
1ed0: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
1ee0: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61  .    pOp->p2 = a
1ef0: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
1f00: 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  ];.  }.  sqliteF
1f10: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
1f20: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
1f30: 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ..  *pMaxFuncArg
1f40: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
1f50: 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d 61  *pMaxStack = nMa
1f60: 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  xStack;..  /* If
1f70: 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61   we never rollba
1f80: 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ck a statement t
1f90: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1fa0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
1fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1fc0: 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f   not needed.  So
1fd0: 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50   change every OP
1fe0: 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20  _Statement.  ** 
1ff0: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f  opcode into an O
2000: 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76  P_Noop.  This av
2010: 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  oid a call to sq
2020: 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e 45 78 63  lite3Os.xOpenExc
2030: 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68  lusive().  ** wh
2040: 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ich can be expen
2050: 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61  sive on some pla
2060: 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69  tforms..  */.  i
2070: 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  f( hasStatementB
2080: 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61  egin && !doesSta
2090: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29  tementRollback )
20a0: 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d  {.    for(pOp=p-
20b0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
20c0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
20d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
20e0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
20f0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
2100: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2110: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
2120: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2130: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2140: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2150: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2160: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2180: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
2190: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
21a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
21b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
21c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
21d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
21e0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
21f0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
2200: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
2210: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
2220: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
2230: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
2240: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
2250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2260: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
2270: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
2280: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
2290: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
22a0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
22b0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
22c0: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
22d0: 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29 3b  , p->nOp + nOp);
22e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 73  .  if( sqlite3Ts
22f0: 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
2300: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
2310: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
2320: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p->nOp;.  if( nO
2330: 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p>0 ){.    int i
2340: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
2350: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
2360: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
2370: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
2380: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
2390: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
23a0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
23b0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
23c0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
23d0: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
23e0: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
23f0: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
2400: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70      pOut->p2 = p
2410: 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44  2<0 ? addr + ADD
2420: 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20  R(p2) : p2;.    
2430: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
2440: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
2450: 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e  ->p3type = pIn->
2460: 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a  p3 ? P3_STATIC :
2470: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66   P3_NOTUSED;.#if
2480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2490: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
24a0: 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
24b0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
24c0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
24d0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
24e0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
24f0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2500: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2510: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
2520: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2530: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2540: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
2550: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2560: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2570: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2580: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
2590: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
25a0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
25b0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
25c0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
25d0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
25e0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
25f0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2600: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2610: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
2620: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2630: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
2640: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2650: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2660: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2670: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
2680: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2690: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
26a0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
26b0: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
26c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
26d0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
26e0: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
26f0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2700: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2720: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
2730: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
2740: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
2750: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2760: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
2770: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2780: 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d  .  assert( val>=
2790: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27a0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
27b0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
27c0: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
27d0: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
27e0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
27f0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
2800: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2810: 2a 2a 20 43 68 61 6e 67 65 20 74 65 68 20 50 32  ** Change teh P2
2820: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
2830: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
2840: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2850: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
2860: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2870: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
2880: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
2890: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
28a0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
28b0: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
28c0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
28d0: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
28e0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
28f0: 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P3 value if nece
2900: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
2910: 20 76 6f 69 64 20 66 72 65 65 50 33 28 69 6e 74   void freeP3(int
2920: 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p3type, void *p
2930: 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29 7b 0a  3){.  if( p3 ){.
2940: 20 20 20 20 73 77 69 74 63 68 28 20 70 33 74 79      switch( p3ty
2950: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
2960: 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20   P3_DYNAMIC:.   
2970: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
2980: 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  FO:.      case P
2990: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
29a0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  F: {.        sql
29b0: 69 74 65 46 72 65 65 28 70 33 29 3b 0a 20 20 20  iteFree(p3);.   
29c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29d0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
29e0: 33 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  3_VDBEFUNC: {.  
29f0: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
2a00: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
2a10: 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20  eFunc *)p3;.    
2a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
2a30: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64  eleteAuxData(pVd
2a40: 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20  beFunc, 0);.    
2a50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2a60: 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20  VdbeFunc);.     
2a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a80: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
2a90: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MEM: {.        s
2aa0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
2ab0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
2ac0: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
2ad0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2ae0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
2af0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2b00: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
2b10: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2b20: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2b30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2b40: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
2b50: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
2b60: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
2b70: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
2b80: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
2b90: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
2ba0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
2bb0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2bc0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2bd0: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
2be0: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33 20 6f  =0 then the P3 o
2bf0: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
2c00: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
2c10: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
2c20: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
2c30: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
2c40: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2c50: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  Malloc()..** A v
2c60: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
2c70: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
2c80: 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69   zP3 up to and i
2c90: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
2ca0: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
2cb0: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
2cc0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
2cd0: 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP3..**.** If n=
2ce0: 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P3_KEYINFO it m
2cf0: 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73  eans that zP3 is
2d00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2d10: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2d20: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
2d30: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
2d40: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
2d50: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
2d60: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
2d70: 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66  eMalloc, to be f
2d80: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
2d90: 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e  be is finalized.
2da0: 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  .** n==P3_KEYINF
2db0: 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61  O_HANDOFF indica
2dc0: 74 65 73 20 74 68 61 74 20 7a 50 33 20 70 6f 69  tes that zP3 poi
2dd0: 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
2de0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74   structure.** st
2df0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74  ored in memory t
2e00: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
2e10: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2e20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e 20 54   sqliteMalloc. T
2e30: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
2e40: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
2e50: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
2e60: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
2e70: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
2e80: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
2e90: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
2ea0: 73 20 6f 66 20 6e 20 28 50 33 5f 53 54 41 54 49  s of n (P3_STATI
2eb0: 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P3_COLLSEQ et
2ec0: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
2ed0: 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP3 points.** 
2ee0: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
2ef0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
2f00: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2f10: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
2f20: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
2f30: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
2f40: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
2f50: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
2f60: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
2f70: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
2f80: 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  3 on the most re
2f90: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
2fa0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2fb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2fc0: 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70  ChangeP3(Vdbe *p
2fd0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
2fe0: 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74  t char *zP3, int
2ff0: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
3000: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3010: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3020: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
3030: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
3040: 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e  | sqlite3Tsd()->
3050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
3060: 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50 33 5f      if (n != P3_
3070: 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20  KEYINFO) {.     
3080: 20 66 72 65 65 50 33 28 6e 2c 20 28 76 6f 69 64   freeP3(n, (void
3090: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 33 29  *)*(char**)&zP3)
30a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30b0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64  rn;.  }.  if( ad
30c0: 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d  dr<0 || addr>=p-
30d0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64 64 72  >nOp ){.    addr
30e0: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
30f0: 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20     if( addr<0 ) 
3100: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f  return;.  }.  pO
3110: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3120: 5d 3b 0a 20 20 66 72 65 65 50 33 28 70 4f 70 2d  ];.  freeP3(pOp-
3130: 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33  >p3type, pOp->p3
3140: 29 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30  );.  pOp->p3 = 0
3150: 3b 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 29  ;.  if( zP3==0 )
3160: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  {.    pOp->p3 = 
3170: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79  0;.    pOp->p3ty
3180: 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b  pe = P3_NOTUSED;
3190: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
31a0: 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P3_KEYINFO ){.  
31b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
31c0: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  nfo;.    int nFi
31d0: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20  eld, nByte;..   
31e0: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49   nField = ((KeyI
31f0: 6e 66 6f 2a 29 7a 50 33 29 2d 3e 6e 46 69 65 6c  nfo*)zP3)->nFiel
3200: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  d;.    nByte = s
3210: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
3220: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69   + (nField-1)*si
3230: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  zeof(pKeyInfo->a
3240: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c  Coll[0]) + nFiel
3250: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  d;.    pKeyInfo 
3260: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3270: 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  w( nByte );.    
3280: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
3290: 29 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  )pKeyInfo;.    i
32a0: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
32b0: 20 20 20 20 20 63 68 61 72 20 2a 61 53 6f 72 74       char *aSort
32c0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
32d0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
32e0: 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  3, nByte);.     
32f0: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
3300: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3310: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
3320: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
3330: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
3340: 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72  ortOrder = (char
3350: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
3360: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
3370: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
3380: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
3390: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
33a0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
33b0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
33c0: 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P3_KEYINFO;.  
33d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
33e0: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
33f0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3400: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
3410: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3420: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   ){.    pOp->p3 
3430: 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20  = (char*)zP3;.  
3440: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3450: 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P3_KEYINFO;.  }e
3460: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
3470: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68     pOp->p3 = (ch
3480: 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70  ar*)zP3;.    pOp
3490: 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p3type = n;.  
34a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
34b0: 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e  ==0 ) n = strlen
34c0: 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP3);.    pOp->
34d0: 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  p3 = sqliteStrND
34e0: 75 70 28 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20  up(zP3, n);.    
34f0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
3500: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3510: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3520: 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
3530: 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 74 68  e P3 field of th
3540: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3550: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
3560: 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e  n with.** commen
3570: 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20  t text..*/.void 
3580: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65  sqlite3VdbeComme
3590: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
35a0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
35b0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
35c0: 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70   ap;.  assert( p
35d0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
35e0: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
35f0: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
3600: 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 73 71 6c 69  1].p3==0 || sqli
3610: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
3620: 46 61 69 6c 65 64 20 29 3b 0a 20 20 76 61 5f 73  Failed );.  va_s
3630: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
3640: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3650: 43 68 61 6e 67 65 50 33 28 70 2c 20 2d 31 2c 20  ChangeP3(p, -1, 
3660: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
3670: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33  zFormat, ap), P3
3680: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f  _DYNAMIC);.  va_
3690: 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69  end(ap);.}.#endi
36a0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
36b0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
36c0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
36d0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
36e0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
36f0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3700: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3710: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3720: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
3730: 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72   addr>=0 && addr
3740: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74  <p->nOp );.  ret
3750: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
3760: 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  ];.}..#if !defin
3770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
3780: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
3790: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
37a0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
37b0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
37c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
37d0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
37e0: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
37f0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
3800: 33 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  3 parameter for 
3810: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
3820: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
3830: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
3840: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
3850: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3860: 2a 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70  *displayP3(Op *p
3870: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
3880: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
3890: 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65  har *zP3;.  asse
38a0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
38b0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
38c0: 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p3type ){.    ca
38d0: 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P3_KEYINFO: {
38e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
38f0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
3900: 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49  pKeyInfo = (KeyI
3910: 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  nfo*)pOp->p3;.  
3920: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d      sprintf(zTem
3930: 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c  p, "keyinfo(%d",
3940: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
3950: 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74  d);.      i = st
3960: 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20  rlen(zTemp);.   
3970: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
3980: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
3990: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
39a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
39b0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
39c0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
39d0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
39e0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
39f0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
3a00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
3a10: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
3a20: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
3a30: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
3a40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
3a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
3a60: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  }.          zTem
3a70: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
3a80: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
3a90: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3aa0: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
3ab0: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
3ac0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
3ad0: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
3ae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3af0: 20 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70     strcpy(&zTemp
3b00: 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  [i], pColl->zNam
3b10: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  e);.          i 
3b20: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  += n;.        }e
3b30: 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d  lse if( i+4<nTem
3b40: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
3b50: 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69   strcpy(&zTemp[i
3b60: 5d 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20  ],",nil");.     
3b70: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
3b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3b90: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
3ba0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
3bb0: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
3bc0: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
3bd0: 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20   );.      zP3 = 
3be0: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
3bf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3c00: 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P3_COLLSEQ: {
3c10: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
3c20: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
3c30: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
3c40: 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20   sprintf(zTemp, 
3c50: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
3c60: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
3c70: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
3c80: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
3c90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3ca0: 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P3_FUNCDEF: {.  
3cb0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
3cc0: 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f  f = (FuncDef*)pO
3cd0: 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 63 68 61  p->p3;.      cha
3ce0: 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20  r zNum[30];.    
3cf0: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
3d00: 20 22 25 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c 20   "%.*s", nTemp, 
3d10: 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pDef->zName);.  
3d20: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d      sprintf(zNum
3d30: 2c 22 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 6e  ,"(%d)", pDef->n
3d40: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
3d50: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 2b 73 74  strlen(zTemp)+st
3d60: 72 6c 65 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e 54  rlen(zNum)+1<=nT
3d70: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
3d80: 74 72 63 61 74 28 7a 54 65 6d 70 2c 20 7a 4e 75  trcat(zTemp, zNu
3d90: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
3da0: 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP3 = zTemp;. 
3db0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3dc0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
3dd0: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70  .      zP3 = pOp
3de0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p3;.      if( 
3df0: 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f  zP3==0 || pOp->o
3e00: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  pcode==OP_Noop )
3e10: 7b 0a 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20  {.        zP3 = 
3e20: 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  "";.      }.    
3e30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
3e40: 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  P3;.}.#endif...#
3e50: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
3e60: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
3e70: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
3e80: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
3e90: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
3ea0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3eb0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
3ec0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
3ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
3ee0: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
3ef0: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
3f00: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20  {.  char *zP3;. 
3f10: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
3f20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
3f30: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
3f40: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
3f50: 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  4d %s\n";.  if( 
3f60: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
3f70: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d   stdout;.  zP3 =
3f80: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
3f90: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
3fa0: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
3fb0: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20  Out, zFormat1,. 
3fc0: 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33       pc, sqlite3
3fd0: 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d  OpcodeNames[pOp-
3fe0: 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70  >opcode], pOp->p
3ff0: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29  1, pOp->p2, zP3)
4000: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
4010: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4020: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
4030: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
4040: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
4050: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
4060: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
4070: 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  N){.  if( p ){. 
4080: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20     while( N-->0 
4090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
40a0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
40b0: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ++);.    }.  }.}
40c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
40d0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
40e0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
40f0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
4100: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
4110: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
4120: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
4130: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
4140: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
4150: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
4160: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
4170: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
4180: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
4190: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
41a0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
41b0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
41c0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
41d0: 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73  PLAIN"..*/.int s
41e0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
41f0: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4210: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
4220: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4230: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
4240: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4250: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
4260: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  ->explain );.  i
4270: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
4280: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65  E_MAGIC_RUN ) re
4290: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
42a0: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  SE;.  assert( db
42b0: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
42c0: 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20  MAGIC_BUSY );.  
42d0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
42e0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
42f0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
4300: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
4310: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
4320: 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e  does not put dyn
4330: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74  amic strings ont
4340: 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73  o the.  ** the s
4350: 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62  tack, they may b
4360: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
4370: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
4380: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
4390: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
43a0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
43b0: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
43c0: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  coding..  */.  i
43d0: 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e  f( p->pTos==&p->
43e0: 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20  aStack[4] ){.   
43f0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
4400: 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a  (p->aStack, 5);.
4410: 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74    }.  p->resOnSt
4420: 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a  ack = 0;..  do{.
4430: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
4440: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e  .  }while( i<p->
4450: 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  nOp && p->explai
4460: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
4470: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
4480: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
4490: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
44a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
44b0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
44c0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
44d0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
44e0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
44f0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
4500: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
4510: 65 72 72 75 70 74 3b 0a 20 20 20 20 70 2d 3e 72  errupt;.    p->r
4520: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
4530: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
4540: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4550: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
4560: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
4570: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
4580: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
4590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
45a0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
45b0: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
45c0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
45d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
45e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
45f0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
4600: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
4610: 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20  em->i = i;      
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
4640: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
4650: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
4660: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
4670: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
4680: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
4690: 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65  pMem->z = sqlite
46a0: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70  3OpcodeNames[pOp
46b0: 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f  ->opcode];  /* O
46c0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65  pcode */.    pMe
46d0: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
46e0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
46f0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
4700: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
4710: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
4720: 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  8;.    pMem++;..
4730: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
4740: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
4750: 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31  Mem->i = pOp->p1
4760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
4780: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
4790: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
47a0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
47b0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
47c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
47d0: 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e   pMem->i = pOp->
47e0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4800: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
4810: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
4820: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
4830: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
4840: 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c  ags = MEM_Short|
4850: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
4860: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
4870: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
4880: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
4890: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
48a0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
48b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
48c0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
48d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
48e0: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
48f0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
4900: 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 2*(p->explain
4910: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  -1);.    p->pTos
4920: 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e   = pMem;.    p->
4930: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4940: 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63      p->resOnStac
4950: 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
4960: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
4970: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
4980: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4990: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
49a0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
49b0: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
49c0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
49d0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
49e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
49f0: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
4a00: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
4a10: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  TE_DEBUG.  int n
4a20: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
4a30: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
4a40: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
4a50: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
4a60: 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20  p[nOp-1];.  if( 
4a70: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4a80: 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21  Noop && pOp->p3!
4a90: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
4aa0: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
4ab0: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  3;.    while( is
4ac0: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29  space(*(u8*)z) )
4ad0: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
4ae0: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
4af0: 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
4b10: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
4b20: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e  e for execution.
4b30: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
4b40: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
4b50: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61  s allocating sta
4b60: 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69  ck space and ini
4b70: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
4b80: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
4b90: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
4ba0: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
4bb0: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
4bc0: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
4bd0: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
4be0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
4bf0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  .  .**.** This i
4c00: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
4c10: 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72  o move a VDBE fr
4c20: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  om VDBE_MAGIC_IN
4c30: 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  IT to.** VDBE_MA
4c40: 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64  GIC_RUN..*/.void
4c50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4c60: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
4c70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4c80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
4c90: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  DBE */.  int nVa
4ca0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
4cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4cc0: 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20  r of '?' see in 
4cd0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
4ce0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c  t */.  int nMem,
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4d10: 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
4d20: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
4d30: 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20   int nCursor,   
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
4d60: 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  sors to allocate
4d70: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
4d80: 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ain             
4d90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4da0: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
4db0: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
4dc0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  */.){.  int n;..
4dd0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4de0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4df0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4e00: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
4e10: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
4e20: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
4e30: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
4e40: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
4e50: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
4e60: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
4e70: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
4e80: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 54  er than later. T
4e90: 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63 61  his.   * is beca
4ea0: 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
4eb0: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29 20  resizeOpArray() 
4ec0: 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b  below may shrink
4ed0: 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70   the.   * p->aOp
4ee0: 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76 65  [] array to save
4ef0: 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65   memory if calle
4f00: 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d  d when in VDBE_M
4f10: 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73  AGIC_RUN .   * s
4f20: 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d  tate..   */.  p-
4f30: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
4f40: 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e  GIC_RUN;..  /* N
4f50: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76  o instruction ev
4f60: 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74  er pushes more t
4f70: 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  han a single ele
4f80: 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20  ment onto the.  
4f90: 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74  ** stack.  And t
4fa0: 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67  he stack never g
4fb0: 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69  rows on successi
4fc0: 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66  ve executions of
4fd0: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c   the.  ** same l
4fe0: 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74  oop.  So the tot
4ff0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73  al number of ins
5000: 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20  tructions is an 
5010: 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a  upper bound.  **
5020: 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   on the maximum 
5030: 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71 75  stack depth requ
5040: 69 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c 61  ired.  (Added la
5050: 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20  ter:)  The.  ** 
5060: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
5070: 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20  ) call computes 
5080: 61 20 74 69 67 68 74 65 72 20 75 70 70 65 72 20  a tighter upper 
5090: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a  bound on the.  *
50a0: 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20  * stack size..  
50b0: 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69  **.  ** Allocati
50c0: 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b  on all the stack
50d0: 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65   space we will e
50e0: 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20  ver need..  */. 
50f0: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d   if( p->aStack==
5100: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
5110: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
5120: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
5130: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
5140: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
5150: 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b  .    int nStack;
5160: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
5170: 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b 20  number of stack 
5180: 65 6e 74 72 69 65 73 20 72 65 71 75 69 72 65 64  entries required
5190: 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50   */.    resolveP
51a0: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
51b0: 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20  , &nStack);.    
51c0: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
51d0: 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73   p->nOp);.    as
51e0: 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b  sert( nVar>=0 );
51f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 74  .    assert( nSt
5200: 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ack<p->nOp );.  
5210: 20 20 6e 53 74 61 63 6b 20 3d 20 69 73 45 78 70    nStack = isExp
5220: 6c 61 69 6e 20 3f 20 31 30 20 3a 20 6e 53 74 61  lain ? 10 : nSta
5230: 63 6b 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63  ck;.    p->aStac
5240: 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  k = sqliteMalloc
5250: 28 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b  (.        nStack
5260: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63  *sizeof(p->aStac
5270: 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61  k[0])    /* aSta
5280: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41  ck */.      + nA
5290: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20  rg*sizeof(Mem*) 
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b  apArg */.      +
52c0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
52d0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
52e0: 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20  /* aVar */.     
52f0: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63   + nVar*sizeof(c
5300: 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20  har*)           
5310: 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20    /* azVar */.  
5320: 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f      + nMem*sizeo
5330: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
5340: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a       /* aMem */.
5350: 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a        + nCursor*
5360: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20  sizeof(Cursor*) 
5370: 20 20 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20         /* apCsr 
5380: 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  */.    );.    if
5390: 28 20 21 73 71 6c 69 74 65 33 54 73 64 28 29 2d  ( !sqlite3Tsd()-
53a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
53b0: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  .      p->aMem =
53c0: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61   &p->aStack[nSta
53d0: 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  ck];.      p->nM
53e0: 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20  em = nMem;.     
53f0: 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61   p->aVar = &p->a
5400: 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20  Mem[nMem];.     
5410: 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b   p->nVar = nVar;
5420: 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20  .      p->okVar 
5430: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  = 0;.      p->ap
5440: 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d  Arg = (Mem**)&p-
5450: 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  >aVar[nVar];.   
5460: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63     p->azVar = (c
5470: 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b  har**)&p->apArg[
5480: 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nArg];.      p->
5490: 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a  apCsr = (Cursor*
54a0: 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72  *)&p->azVar[nVar
54b0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72  ];.      p->nCur
54c0: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
54d0: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
54e0: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
54f0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
5500: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
5510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5520: 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c   }.  for(n=0; n<
5530: 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  p->nMem; n++){. 
5540: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
5550: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
5560: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
5570: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28  TE_DEBUG.  if( (
5580: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
5590: 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e  QLITE_VdbeListin
55a0: 67 29 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c  g)!=0.    || sql
55b0: 69 74 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73  ite3Os.xFileExis
55c0: 74 73 28 22 76 64 62 65 5f 65 78 70 6c 61 69 6e  ts("vdbe_explain
55d0: 22 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  ").  ){.    int 
55e0: 69 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56  i;.    printf("V
55f0: 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74  DBE Program List
5600: 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71  ing:\n");.    sq
5610: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
5620: 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  l(p);.    for(i=
5630: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
5640: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5650: 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f  VdbePrintOp(stdo
5660: 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
5670: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
5680: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 2e 78 46  if( sqlite3Os.xF
5690: 69 6c 65 45 78 69 73 74 73 28 22 76 64 62 65 5f  ileExists("vdbe_
56a0: 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20 20 70  trace") ){.    p
56b0: 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  ->trace = stdout
56c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
56d0: 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74  ->pTos = &p->aSt
56e0: 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63  ack[-1];.  p->pc
56f0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
5700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
5710: 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a  >uniqueCnt = 0;.
5720: 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68    p->returnDepth
5730: 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72   = 0;.  p->error
5740: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
5750: 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b  t;.  p->popStack
5760: 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c   =  0;.  p->expl
5770: 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e  ain |= isExplain
5780: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
5790: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
57a0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
57b0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
57c0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
57d0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
57e0: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ILE.  {.    int 
57f0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
5800: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
5810: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
5820: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
5830: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
5840: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
5850: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
5860: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e  lose a cursor an
5870: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
5880: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
5890: 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a   cursor happens.
58a0: 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ** to hold..*/.v
58b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
58c0: 72 65 65 43 75 72 73 6f 72 28 43 75 72 73 6f 72  reeCursor(Cursor
58d0: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
58e0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
58f0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
5900: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
5910: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
5920: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
5930: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  Cursor);.  }.  i
5940: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
5950: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
5960: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
5970: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
5980: 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pCx->pData);.  
5990: 73 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e  sqliteFree(pCx->
59a0: 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  aType);.  sqlite
59b0: 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a  Free(pCx);.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
59d0: 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20  rsors.*/.static 
59e0: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
59f0: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
5a00: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
5a10: 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75  >apCsr==0 ) retu
5a20: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
5a30: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
5a40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5a50: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
5a60: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20 70  apCsr[i]);.    p
5a70: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
5a80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
5a90: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
5aa0: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a  er execution..**
5ab0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5ac0: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
5ad0: 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75  lly close any cu
5ae0: 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e  rsors, lists, an
5af0: 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20  d/or.** sorters 
5b00: 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f  that were left o
5b10: 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65  pen.  It also de
5b20: 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73  letes the values
5b30: 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73   of.** variables
5b40: 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61   in the aVar[] a
5b50: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
5b60: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
5b70: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
5b80: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20    if( p->aStack 
5b90: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
5ba0: 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b  mArray(p->aStack
5bb0: 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d  , 1 + (p->pTos -
5bc0: 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20   p->aStack));.  
5bd0: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e    p->pTos = &p->
5be0: 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a  aStack[-1];.  }.
5bf0: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
5c00: 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  s(p);.  releaseM
5c10: 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
5c20: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c   p->nMem);.  sql
5c30: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
5c40: 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20  r(&p->sFifo);.  
5c50: 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  if( p->contextSt
5c60: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ack ){.    for(i
5c70: 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74  =0; i<p->context
5c80: 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a  StackTop; i++){.
5c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ca0: 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63  eFifoClear(&p->c
5cb0: 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73  ontextStack[i].s
5cc0: 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Fifo);.    }.   
5cd0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 63   sqliteFree(p->c
5ce0: 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20  ontextStack);.  
5cf0: 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  }.  p->contextSt
5d00: 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  ack = 0;.  p->co
5d10: 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20  ntextStackDepth 
5d20: 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78  = 0;.  p->contex
5d30: 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20  tStackTop = 0;. 
5d40: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
5d50: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
5d60: 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rrMsg = 0;.}../*
5d70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
5d80: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
5d90: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
5da0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
5db0: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
5dc0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
5dd0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
5de0: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
5df0: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
5e00: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
5e10: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
5e20: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
5e30: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
5e40: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
5e50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
5e60: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
5e70: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
5e80: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
5e90: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
5ea0: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
5eb0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
5ec0: 69 6e 74 20 6e 3b 0a 20 20 72 65 6c 65 61 73 65  int n;.  release
5ed0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
5ee0: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
5ef0: 75 6d 6e 2a 32 29 3b 0a 20 20 73 71 6c 69 74 65  umn*2);.  sqlite
5f00: 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  Free(p->aColName
5f10: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
5f20: 75 6d 6e 2a 32 3b 0a 20 20 70 2d 3e 6e 52 65 73  umn*2;.  p->nRes
5f30: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c  Column = nResCol
5f40: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
5f50: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
5f60: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  (Mem*)sqliteMall
5f70: 6f 63 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  oc( sizeof(Mem)*
5f80: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
5f90: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
5fa0: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
5fb0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 28 70 43 6f   > 0 ){.    (pCo
5fc0: 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20  lName++)->flags 
5fd0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a  = MEM_Null;.  }.
5fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5ff0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
6000: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
6010: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
6020: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
6030: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
6040: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6050: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
6060: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
6070: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
6080: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
6090: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
60a0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
60b0: 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54  ** If N==P3_STAT
60c0: 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61  IC  it means tha
60d0: 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69  t zName is a poi
60e0: 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61  nter to a consta
60f0: 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72  nt static.** str
6100: 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a  ing and we can j
6110: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
6120: 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50  nter. If it is P
6130: 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  3_DYNAMIC, then 
6140: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
6150: 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  s freed using sq
6160: 6c 69 74 65 46 72 65 65 28 29 20 77 68 65 6e 20  liteFree() when 
6170: 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e 69  the vdbe is fini
6180: 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e  shed with.** it.
6190: 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79   Otherwise, N by
61a0: 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65  tes of zName are
61b0: 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20   copied..*/.int 
61c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
61d0: 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69  lName(Vdbe *p, i
61e0: 6e 74 20 69 64 78 2c 20 63 6f 6e 73 74 20 63 68  nt idx, const ch
61f0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
6210: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
6220: 61 73 73 65 72 74 28 20 69 64 78 3c 28 32 2a 70  assert( idx<(2*p
6230: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29 3b  ->nResColumn) );
6240: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 73  .  if( sqlite3Ts
6250: 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
6260: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
6270: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72  E_NOMEM;.  asser
6280: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
6290: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
62a0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
62b0: 69 64 78 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d  idx]);.  if( N==
62c0: 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d  P3_DYNAMIC || N=
62d0: 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20  =P3_STATIC ){.  
62e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
62f0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
6300: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
6310: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
6320: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
6330: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
6340: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
6350: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
6360: 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f  Name, N, SQLITE_
6370: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e  UTF8,SQLITE_TRAN
6380: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66  SIENT);.  }.  if
6390: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
63a0: 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43  && N==P3_DYNAMIC
63b0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
63c0: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e  ->flags = (pColN
63d0: 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d  ame->flags&(~MEM
63e0: 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79  _Static))|MEM_Dy
63f0: 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  n;.    pColName-
6400: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  >xDel = 0;.  }. 
6410: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6420: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
6430: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
6440: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
6450: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
6460: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
6470: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
6480: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
6490: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
64a0: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
64b0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
64c0: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
64d0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
64e0: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
64f0: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
6500: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
6510: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
6520: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
6530: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
6540: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
6550: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
6560: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
6570: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
6580: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
6590: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
65a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
65b0: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
65c0: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  mmit = 0;..  for
65d0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
65e0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
65f0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
6600: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
6610: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
6620: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
6630: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
6640: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
6650: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
6660: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
6670: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
6680: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
6690: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
66a0: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
66b0: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
66c0: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
66d0: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
66e0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71  llback ){.    sq
66f0: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
6700: 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d  b);.    rc = db-
6710: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
6720: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
6730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66  ;.    sqlite3Saf
6740: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69  etyOn(db);.    i
6750: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
6760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
6770: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20  STRAINT;.    }. 
6780: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
6790: 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
67a0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
67b0: 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
67c0: 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
67d0: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
67e0: 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
67f0: 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
6800: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
6810: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
6820: 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
6830: 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
6840: 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
6850: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
6860: 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
6870: 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
6880: 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
6890: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
68a0: 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74   :memory:.  In t
68b0: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20  hat case we do. 
68c0: 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   ** not support 
68d0: 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
68e0: 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
68f0: 65 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73  e the simple cas
6900: 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e  e then.  ** too.
6910: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
6920: 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72  trlen(sqlite3Btr
6930: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
6940: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c  ->aDb[0].pBt)) |
6950: 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20  | nTrans<=1 ){. 
6960: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
6970: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
6980: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
6990: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
69a0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
69b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
69c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
69d0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
69e0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
69f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
6a00: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
6a10: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
6a20: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
6a30: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 20 20 69   synced */.    i
6a40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6a50: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
6a60: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
6a70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 74 72 65  +){.        Btre
6a80: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
6a90: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  [i].pBt;.       
6aa0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
6ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6ac0: 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
6ad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6ae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6af0: 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
6b00: 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
6b10: 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
6b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
6b30: 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
6b40: 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
6b50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
6b60: 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
6b70: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
6b80: 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c  ommitted atomicl
6b90: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
6ba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
6bb0: 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69  IO.  else{.    i
6bc0: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
6bd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
6be0: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
6bf0: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
6c00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
6c10: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
6c20: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
6c30: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
6c40: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
6c50: 70 42 74 29 3b 0a 20 20 20 20 4f 73 46 69 6c 65  pBt);.    OsFile
6c60: 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20   *master = 0;.. 
6c70: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
6c80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
6c90: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64  le name */.    d
6ca0: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61  o {.      u32 ra
6cb0: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ndom;.      sqli
6cc0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
6cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 61  .      sqlite3Ra
6ce0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
6cf0: 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d  random), &random
6d00: 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72  );.      zMaster
6d10: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
6d20: 66 28 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a  f("%s-mj%08X", z
6d30: 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d  MainFile, random
6d40: 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20  &0x7fffffff);.  
6d50: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
6d60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6d70: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
6d90: 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 2e 78  ile( sqlite3Os.x
6da0: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
6db0: 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  er) );..    /* O
6dc0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
6dd0: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72  ournal. */.    r
6de0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 2e 78 4f  c = sqlite3Os.xO
6df0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d 61  penExclusive(zMa
6e00: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20 30  ster, &master, 0
6e10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
6e20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6e30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
6e40: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
6e50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
6e60: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
6e70: 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
6e80: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
6e90: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
6ea0: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
6eb0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
6ec0: 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
6ed0: 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
6ee0: 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
6ef0: 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
6f00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6f10: 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
6f20: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
6f30: 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
6f40: 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
6f50: 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
6f60: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
6f70: 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
6f80: 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
6f90: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
6fa0: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
6fb0: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
6fc0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
6fd0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
6fe0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
6ff0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
7000: 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f     if( i==1 ) co
7010: 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e  ntinue;   /* Ign
7020: 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ore the TEMP dat
7030: 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  abase */.      i
7040: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
7050: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
7060: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
7070: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
7080: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
7090: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
70a0: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
70b0: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63   zFile[0]==0 ) c
70c0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
70d0: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  ore :memory: dat
70e0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
70f0: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
7100: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
7110: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
7120: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
7130: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
7140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
7150: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
7160: 74 65 28 6d 61 73 74 65 72 2c 20 7a 46 69 6c 65  te(master, zFile
7170: 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  , strlen(zFile)+
7180: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
7190: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
71a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
71b0: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65  e3OsClose(&maste
71c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
71d0: 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74 65 28  lite3Os.xDelete(
71e0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
71f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7200: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
7210: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7230: 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53      }...    /* S
7240: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
7250: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66  ournal file. Bef
7260: 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
7270: 6f 70 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f  open the directo
7280: 72 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61  ry.    ** the ma
7290: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
72a0: 65 20 69 73 20 73 74 6f 72 65 20 69 6e 20 73 6f  e is store in so
72b0: 20 74 68 61 74 20 69 74 20 67 65 74 73 20 73 79   that it gets sy
72c0: 6e 63 65 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f  nced too..    */
72d0: 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d  .    zMainFile =
72e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
72f0: 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  Dirname(db->aDb[
7300: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 72 63 20  0].pBt);.    rc 
7310: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44  = sqlite3OsOpenD
7320: 69 72 65 63 74 6f 72 79 28 6d 61 73 74 65 72 2c  irectory(master,
7330: 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
7340: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7350: 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  OK ||.          
7360: 28 6e 65 65 64 53 79 6e 63 20 26 26 20 28 72 63  (needSync && (rc
7370: 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 6d  =sqlite3OsSync(m
7380: 61 73 74 65 72 2c 30 29 29 21 3d 53 51 4c 49 54  aster,0))!=SQLIT
7390: 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73  E_OK) ){.      s
73a0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d  qlite3OsClose(&m
73b0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
73c0: 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74 65 28  lite3Os.xDelete(
73d0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
73e0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
73f0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
7400: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
7410: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
7420: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
7430: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
7440: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
7450: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
7460: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7470: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
7480: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
7490: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
74a0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
74b0: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
74c0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
74d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
74e0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
74f0: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
7500: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
7510: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
7520: 33 42 74 72 65 65 53 79 6e 63 28 29 2c 0a 20 20  3BtreeSync(),.  
7530: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
7540: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
7550: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7560: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
7570: 0a 20 20 20 20 2a 2a 20 6f 72 70 68 61 6e 65 64  .    ** orphaned
7580: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
7590: 64 65 6c 65 74 65 20 69 74 2c 20 69 6e 20 63 61  delete it, in ca
75a0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
75b0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
75c0: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
75d0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
75e0: 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
75f0: 74 68 65 20 66 61 69 6c 75 72 65 0a 20 20 20 20  the failure.    
7600: 2a 2a 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  ** occured..    
7610: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
7620: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7630: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
7640: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7650: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
7660: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
7670: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
7680: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
7690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
76a0: 63 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  c(pBt, zMaster);
76b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
76c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
76d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
76e0: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
76f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7700: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
7710: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7720: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
7730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7740: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
7750: 26 6d 61 73 74 65 72 29 3b 0a 0a 20 20 20 20 2f  &master);..    /
7760: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
7770: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7780: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
7790: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
77a0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
77b0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
77c0: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
77d0: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
77e0: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
77f0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
7800: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
7810: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
7820: 3d 20 73 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c  = sqlite3Os.xDel
7830: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ete(zMaster);.  
7840: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
7850: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73  LITE_OK );.    s
7860: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
7870: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
7880: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
7890: 6c 69 74 65 33 4f 73 2e 78 53 79 6e 63 44 69 72  lite3Os.xSyncDir
78a0: 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c 65  ectory(zMainFile
78b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
78c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
78d0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    /* This is not
78e0: 20 67 6f 6f 64 2e 20 54 68 65 20 6d 61 73 74 65   good. The maste
78f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
7900: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
7910: 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
7920: 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
7930: 20 66 61 69 6c 65 64 2e 20 54 68 65 72 65 20 69   failed. There i
7940: 73 20 6e 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  s no completely 
7950: 73 61 66 65 20 63 6f 75 72 73 65 20 6f 66 0a 20  safe course of. 
7960: 20 20 20 20 20 2a 2a 20 61 63 74 69 6f 6e 20 66       ** action f
7970: 72 6f 6d 20 68 65 72 65 2e 20 54 68 65 20 69 6e  rom here. The in
7980: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
7990: 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  s contain the na
79a0: 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
79b0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
79c0: 6c 20 66 69 6c 65 2c 20 62 75 74 20 74 68 65 72  l file, but ther
79d0: 65 20 69 73 20 6e 6f 20 77 61 79 20 6f 66 20 6b  e is no way of k
79e0: 6e 6f 77 69 6e 67 20 69 66 20 74 68 61 74 0a 20  nowing if that. 
79f0: 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a       ** master j
7a00: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 6e 6f  ournal exists no
7a10: 77 20 6f 72 20 69 66 20 69 74 20 77 69 6c 6c 20  w or if it will 
7a20: 65 78 69 73 74 20 61 66 74 65 72 20 74 68 65 20  exist after the 
7a30: 6f 70 65 72 61 74 69 6e 67 0a 20 20 20 20 20 20  operating.      
7a40: 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 20  ** system crash 
7a50: 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20  that may follow 
7a60: 74 68 65 20 66 73 79 6e 63 28 29 20 66 61 69 6c  the fsync() fail
7a70: 75 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ure..      */.  
7a80: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7a90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
7aa0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
7ab0: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
7ac0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
7ad0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
7ae0: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
7af0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
7b00: 6d 6d 69 74 28 29 20 61 72 65 20 6f 6e 6c 79 20  mmit() are only 
7b10: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
7b20: 64 20 64 65 6c 65 74 69 6e 67 0a 20 20 20 20 2a  d deleting.    *
7b30: 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  * journals. If s
7b40: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
7b50: 6f 6e 67 20 77 68 69 6c 65 20 74 68 69 73 20 69  ong while this i
7b60: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
7b70: 6f 6e 27 74 0a 20 20 20 20 2a 2a 20 72 65 61 6c  on't.    ** real
7b80: 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
7b90: 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 74 72  egrity of the tr
7ba0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
7bb0: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
7bc0: 0a 20 20 20 20 2a 2a 20 62 75 74 20 73 6f 6d 65  .    ** but some
7bd0: 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
7be0: 75 72 6e 61 6c 73 20 6d 61 79 20 62 65 20 6c 79  urnals may be ly
7bf0: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
7c00: 72 6e 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  rning an.    ** 
7c10: 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
7c20: 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
7c30: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
7c40: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
7c50: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
7c60: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
7c70: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
7c80: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
7c90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
7ca0: 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
7cb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
7cc0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
7cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65  .}../*.** Find e
7ce0: 76 65 72 79 20 61 63 74 69 76 65 20 56 4d 20 6f  very active VM o
7cf0: 74 68 65 72 20 74 68 61 6e 20 70 56 64 62 65 20  ther than pVdbe 
7d00: 61 6e 64 20 63 68 61 6e 67 65 20 69 74 73 20 73  and change its s
7d10: 74 61 74 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72  tatus to.** abor
7d20: 74 65 64 2e 20 20 54 68 69 73 20 68 61 70 70 65  ted.  This happe
7d30: 6e 73 20 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63  ns when one VM c
7d40: 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
7d50: 20 64 75 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e   due to an.** ON
7d60: 20 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41   CONFLICT ROLLBA
7d70: 43 4b 20 63 6c 61 75 73 65 20 28 66 6f 72 20 65  CK clause (for e
7d80: 78 61 6d 70 6c 65 29 2e 20 20 54 68 65 20 6f 74  xample).  The ot
7d90: 68 65 72 20 56 4d 73 20 6d 75 73 74 20 62 65 0a  her VMs must be.
7da0: 2a 2a 20 61 62 6f 72 74 65 64 20 73 6f 20 74 68  ** aborted so th
7db0: 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 68  at they do not h
7dc0: 61 76 65 20 64 61 74 61 20 72 6f 6c 6c 65 64 20  ave data rolled 
7dd0: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65  out from underne
7de0: 61 74 68 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64  ath.** them lead
7df0: 69 6e 67 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ing to a segfaul
7e00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7e10: 64 20 61 62 6f 72 74 4f 74 68 65 72 41 63 74 69  d abortOtherActi
7e20: 76 65 56 64 62 65 73 28 56 64 62 65 20 2a 70 56  veVdbes(Vdbe *pV
7e30: 64 62 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 4f  dbe){.  Vdbe *pO
7e40: 74 68 65 72 3b 0a 20 20 66 6f 72 28 70 4f 74 68  ther;.  for(pOth
7e50: 65 72 3d 70 56 64 62 65 2d 3e 64 62 2d 3e 70 56  er=pVdbe->db->pV
7e60: 64 62 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74  dbe; pOther; pOt
7e70: 68 65 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78  her=pOther->pNex
7e80: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 74 68  t){.    if( pOth
7e90: 65 72 3d 3d 70 56 64 62 65 20 29 20 63 6f 6e 74  er==pVdbe ) cont
7ea0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
7eb0: 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42  ther->magic!=VDB
7ec0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
7ed0: 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f  Other->pc<0 ) co
7ee0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63 6c 6f 73  ntinue;.    clos
7ef0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 4f 74 68  eAllCursors(pOth
7f00: 65 72 29 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d  er);.    pOther-
7f10: 3e 61 62 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  >aborted = 1;.  
7f20: 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  }.}../* .** This
7f30: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
7f40: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
7f50: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
7f60: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
7f70: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
7f80: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
7f90: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
7fa0: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
7fb0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
7fc0: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
7fd0: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
7fe0: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
7ff0: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
8000: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
8010: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
8020: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
8030: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
8040: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
8050: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
8060: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
8070: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
8080: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
8090: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
80a0: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
80b0: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
80c0: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
80d0: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
80e0: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
80f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
8100: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
8110: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
8120: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
8130: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
8140: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
8150: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74  rt( cnt==db->act
8160: 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a  iveVdbeCnt );.}.
8170: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
8180: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
8190: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
81a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
81b0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
81c0: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
81d0: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
81e0: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
81f0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
8200: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
8210: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
8220: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
8230: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
8240: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
8250: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
8260: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8270: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
8280: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
8290: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
82a0: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
82b0: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
82c0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a  E_MAGIC_HALT..**
82d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
82e0: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
82f0: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
8300: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
8310: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
8320: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
8330: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
8340: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
8350: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
8360: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
8370: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
8380: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
8390: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
83a0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
83b0: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
83c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
83d0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
83e0: 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65  t (*xFunc)(Btree
83f0: 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20   *pBt) = 0;  /* 
8400: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
8410: 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20 62   on each btree b
8420: 61 63 6b 65 6e 64 20 2a 2f 0a 0a 20 20 69 66 28  ackend */..  if(
8430: 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d   sqlite3Tsd()->m
8440: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
8450: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
8460: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
8470: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
8480: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
8490: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 68      /* Already h
84a0: 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20  alted.  Nothing 
84b0: 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73  to do. */.    as
84c0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
84d0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
84e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
84f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
8500: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
8510: 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  );.  checkActive
8520: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
8530: 66 28 20 70 2d 3e 70 63 3c 30 20 29 7b 0a 20 20  f( p->pc<0 ){.  
8540: 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
8550: 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
8560: 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
8570: 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a   never started *
8580: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  /.  }else if( db
8590: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20  ->autoCommit && 
85a0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
85b0: 74 3d 3d 31 20 29 7b 0a 0a 20 20 20 20 69 66 28  t==1 ){..    if(
85c0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
85d0: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
85e0: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
85f0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4e   p->rc!=SQLITE_N
8600: 4f 4d 45 4d 29 29 7b 0a 20 20 20 20 20 20 2f 2a  OMEM)){.      /*
8610: 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
8620: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
8630: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
8640: 72 20 61 63 74 69 76 65 20 71 75 65 72 69 65 73  r active queries
8650: 0a 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  .      ** using 
8660: 74 68 69 73 20 68 61 6e 64 6c 65 20 61 6e 64 20  this handle and 
8670: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
8680: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
8690: 6f 72 20 68 69 74 20 61 6e 0a 20 20 20 20 20 20  or hit an.      
86a0: 2a 2a 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  ** 'OR FAIL' con
86b0: 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65  straint. This me
86c0: 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 69 73 20  ans a commit is 
86d0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
86e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  */.      int rc 
86f0: 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29  = vdbeCommit(db)
8700: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
8710: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
8720: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8730: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
8740: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
8750: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8760: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
8770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
8780: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
8790: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
87a0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
87b0: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
87c0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s(db);.      }. 
87d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
87e0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
87f0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ll(db);.    }.  
8800: 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 69 66 28 20  }else{..    if( 
8810: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8820: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MEM ){.      /* 
8830: 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73  This loop does s
8840: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f  tatic analysis o
8850: 66 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 73  f the query to s
8860: 65 65 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a  ee which of the.
8870: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
8880: 6e 67 20 74 68 72 65 65 20 63 61 74 65 67 6f 72  ng three categor
8890: 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74  ies it falls int
88a0: 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o:.      **.    
88b0: 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e    **     Read-on
88c0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ly.      **     
88d0: 51 75 65 72 79 20 77 69 74 68 20 73 74 61 74 65  Query with state
88e0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 20 20 20  ment journal    
88f0: 20 20 20 20 20 20 2d 3e 20 72 6f 6c 6c 62 61 63        -> rollbac
8900: 6b 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  k statement.    
8910: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
8920: 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e 74  ithout statement
8930: 20 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 2d   journal       -
8940: 3e 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  > rollback trans
8950: 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 0a  action.      **.
8960: 20 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c        ** We coul
8970: 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d  d do something m
8980: 6f 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e  ore elegant than
8990: 20 74 68 69 73 20 73 74 61 74 69 63 20 61 6e 61   this static ana
89a0: 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20  lysis (i.e..    
89b0: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74    ** store the t
89c0: 79 70 65 20 6f 66 20 71 75 65 72 79 20 61 73 20  ype of query as 
89d0: 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  part of the comp
89e0: 6c 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20  liation phase), 
89f0: 62 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61  but .      ** ha
8a00: 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20  ndling malloc() 
8a10: 66 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69  failure is a fai
8a20: 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65  rly obscure edge
8a30: 20 63 61 73 65 20 73 6f 20 74 68 69 73 20 69 73   case so this is
8a40: 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
8a50: 6c 79 20 65 61 73 69 65 72 2e 0a 20 20 20 20 20  ly easier..     
8a60: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64   **.      ** Tod
8a70: 6f 3a 20 54 68 69 73 20 6d 65 61 6e 73 20 77 65  o: This means we
8a80: 20 61 6c 77 61 79 73 20 6f 76 65 72 72 69 64 65   always override
8a90: 20 74 68 65 20 70 2d 3e 65 72 72 6f 72 41 63 74   the p->errorAct
8aa0: 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 0a  ion value for a.
8ab0: 20 20 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28        ** malloc(
8ac0: 29 20 66 61 69 6c 75 72 65 2e 20 49 73 20 74 68  ) failure. Is th
8ad0: 65 72 65 20 61 6e 79 20 6f 74 68 65 72 20 63 68  ere any other ch
8ae0: 6f 69 63 65 20 68 65 72 65 20 74 68 6f 75 67 68  oice here though
8af0: 3f 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ?.      */.     
8b00: 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20   int isReadOnly 
8b10: 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
8b20: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  sStatement = 0;.
8b30: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e        assert(p->
8b40: 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30  aOp || p->nOp==0
8b50: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
8b60: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
8b70: 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  { .        switc
8b80: 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  h( p->aOp[i].opc
8b90: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
8ba0: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
8bb0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  tion:.          
8bc0: 20 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30    isReadOnly = 0
8bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
8be0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
8bf0: 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ase OP_Statement
8c00: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  :.            is
8c10: 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20  Statement = 1;. 
8c20: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8c30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8c40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69    }.      if( (i
8c50: 73 52 65 61 64 4f 6e 6c 79 7c 7c 69 73 53 74 61  sReadOnly||isSta
8c60: 74 65 6d 65 6e 74 29 20 26 26 20 70 2d 3e 65 72  tement) && p->er
8c70: 72 6f 72 41 63 74 69 6f 6e 21 3d 4f 45 5f 52 6f  rorAction!=OE_Ro
8c80: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
8c90: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
8ca0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
8cb0: 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20     }else{ .     
8cc0: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
8cd0: 6e 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b  n = OE_Rollback;
8ce0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8cf0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
8d00: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
8d10: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
8d20: 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 78 46 75  ail ){.      xFu
8d30: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
8d40: 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20  eCommitStmt;.   
8d50: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
8d60: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
8d70: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 78 46 75  ort ){.      xFu
8d80: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
8d90: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
8da0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8db0: 61 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65  abortOtherActive
8dc0: 56 64 62 65 73 28 70 29 3b 0a 20 20 20 20 20 20  Vdbes(p);.      
8dd0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
8de0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  ll(db);.      db
8df0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
8e00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8e10: 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f  * If xFunc is no
8e20: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
8e30: 69 73 20 6f 6e 65 20 6f 66 20 0a 20 20 2a 2a 20  is one of .  ** 
8e40: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
8e50: 62 61 63 6b 53 74 6d 74 20 6f 72 20 73 71 6c 69  backStmt or sqli
8e60: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
8e70: 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65  mt. Call it once
8e80: 20 6f 6e 0a 20 20 2a 2a 20 65 61 63 68 20 62 61   on.  ** each ba
8e90: 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72  ckend. If an err
8ea0: 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  or occurs and th
8eb0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
8ec0: 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 53 51 4c 49   still.  ** SQLI
8ed0: 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72  TE_OK, set the r
8ee0: 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68  eturn code to th
8ef0: 65 20 6e 65 77 20 65 72 72 6f 72 20 76 61 6c 75  e new error valu
8f00: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
8f10: 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 78  (!xFunc ||.    x
8f20: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
8f30: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a  eeCommitStmt ||.
8f40: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
8f50: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
8f60: 74 6d 74 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69  tmt.  );.  for(i
8f70: 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64  =0; xFunc && i<d
8f80: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8f90: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
8fa0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
8fb0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
8fc0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
8fd0: 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29   rc = xFunc(pBt)
8fe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
8ff0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
9000: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d  ->rc = rc;.    }
9010: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9020: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
9030: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
9040: 54 45 2c 20 73 65 74 20 74 68 65 20 63 68 61 6e  TE, set the chan
9050: 67 65 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20  ge counter. */. 
9060: 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
9070: 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  tOn && p->pc>=0 
9080: 29 7b 0a 20 20 20 20 69 66 28 20 21 78 46 75 6e  ){.    if( !xFun
9090: 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69  c || xFunc==sqli
90a0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
90b0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mt ){.      sqli
90c0: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
90d0: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
90e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
90f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9100: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
9110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
9120: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  Change = 0;.  }.
9130: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f  .  /* Rollback o
9140: 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68  r commit any sch
9150: 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74  ema changes that
9160: 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20   occurred. */.  
9170: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
9180: 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67  E_OK && db->flag
9190: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
91a0: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
91b0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
91c0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
91d0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  .    db->flags =
91e0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51   (db->flags | SQ
91f0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
9200: 65 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  es);.  }..  /* W
9210: 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
9220: 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
9230: 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
9240: 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
9250: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
9260: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63  =0 ){.    db->ac
9270: 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  tiveVdbeCnt--;. 
9280: 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
9290: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
92a0: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
92b0: 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65  beCnt(db);..  re
92c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
92d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
92e0: 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
92f0: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
9300: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
9310: 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
9320: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
9330: 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
9340: 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
9350: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
9360: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
9370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
9380: 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
9390: 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
93a0: 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
93b0: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
93c0: 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
93d0: 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
93e0: 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
93f0: 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
9400: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
9410: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
9420: 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
9430: 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
9440: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
9450: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9460: 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
9470: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p){.  if( p->mag
9480: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
9490: 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d  UN && p->magic!=
94a0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
94b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
94c0: 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  ror(p->db, SQLIT
94d0: 45 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20  E_MISUSE, 0);.  
94e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
94f0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f  MISUSE;.  }..  /
9500: 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
9510: 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
9520: 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
9530: 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
9540: 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
9550: 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
9560: 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
9570: 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
9580: 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
9590: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
95a0: 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
95b0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
95c0: 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
95d0: 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
95e0: 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
95f0: 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
9600: 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
9610: 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
9620: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
9630: 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
9640: 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
9650: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
9660: 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
9670: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
9680: 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
9690: 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
96a0: 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
96b0: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
96c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
96d0: 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
96e0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
96f0: 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
9700: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9710: 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e  Error(p->db, p->
9720: 72 63 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 45 72  rc, "%s", p->zEr
9730: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
9740: 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d  iteFree(p->zErrM
9750: 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
9760: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
9770: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
9780: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9790: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
97a0: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
97b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
97c0: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49  rror(p->db, SQLI
97d0: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
97e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
97f0: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
9800: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
9810: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
9820: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
9830: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
9840: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
9850: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
9860: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
9870: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
9880: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
9890: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
98a0: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
98b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
98c0: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
98d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70    sqlite3Error(p
98e0: 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  ->db, p->rc, 0);
98f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
9900: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
9910: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
9920: 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
9930: 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
9940: 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
9950: 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
9960: 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  E run..  */.  as
9970: 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70  sert( p->pTos<&p
9980: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30  ->aStack[p->pc<0
9990: 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d  ?0:p->pc] || !p-
99a0: 3e 61 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65  >aStack );.#ifde
99b0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
99c0: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
99d0: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
99e0: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
99f0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
9a00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
9a10: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
9a20: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
9a30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
9a40: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
9a50: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
9a60: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
9a70: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
9a80: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
9a90: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
9aa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
9ab0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
9ac0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
9ad0: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
9ae0: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
9af0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
9b00: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
9b10: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
9b20: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
9b30: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
9b40: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
9b50: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
9b60: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
9b70: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
9b80: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
9b90: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
9ba0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
9bb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
9bc0: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
9bd0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
9be0: 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d  ;.  p->aborted =
9bf0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
9c00: 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29  =SQLITE_SCHEMA )
9c10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
9c20: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
9c30: 28 70 2d 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  (p->db, 0);.  }.
9c40: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
9c50: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
9c60: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
9c70: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
9c80: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
9c90: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
9ca0: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
9cb0: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
9cc0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
9cd0: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
9ce0: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
9cf0: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
9d00: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
9d10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
9d20: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
9d30: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
9d40: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
9d50: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
9d60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
9d70: 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 7d  dbeReset(p);.  }
9d80: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69  else if( p->magi
9d90: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
9da0: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
9db0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
9dc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
9dd0: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
9de0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9df0: 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
9e00: 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
9e10: 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
9e20: 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
9e30: 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
9e40: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
9e50: 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
9e60: 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
9e70: 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
9e80: 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
9e90: 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
9ea0: 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
9eb0: 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
9ec0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
9ed0: 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
9ee0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
9ef0: 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
9f00: 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
9f10: 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
9f20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
9f30: 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
9f40: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
9f50: 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
9f60: 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
9f70: 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
9f80: 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31  >31 || !(mask&(1
9f90: 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
9fa0: 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
9fb0: 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
9fd0: 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
9fe0: 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
9ff0: 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
a000: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
a010: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
a020: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
a030: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a040: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
a050: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
a060: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
a070: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20    Cleanup(p);.  
a080: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
a090: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
a0a0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
a0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
a0c0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
a0d0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
a0e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
a0f0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
a100: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
a110: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
a120: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
a130: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
a140: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
a150: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
a160: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e    Op *pOp = &p->
a170: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72  aOp[i];.      fr
a180: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
a190: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  , pOp->p3);.    
a1a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
a1b0: 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20  (p->aOp);.  }.  
a1c0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
a1d0: 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
a1e0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a1f0: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
a200: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61  liteFree(p->aSta
a210: 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ck);.  releaseMe
a220: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
a230: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
a240: 6e 2a 32 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  n*2);.  sqliteFr
a250: 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  ee(p->aColName);
a260: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a270: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
a280: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
a290: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  }../*.** If a Mo
a2a0: 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
a2b0: 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
a2c0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
a2d0: 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
a2e0: 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75  oveTo now.  Retu
a2f0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
a300: 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20  .  If no MoveTo 
a310: 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73  is pending, this
a320: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  .** routine does
a330: 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74   nothing and ret
a340: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
a350: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
a360: 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43  beCursorMoveto(C
a370: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
a380: 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
a390: 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  to ){.    int re
a3a0: 73 2c 20 72 63 3b 0a 20 20 20 20 65 78 74 65 72  s, rc;.    exter
a3b0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
a3c0: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20  arch_count;.    
a3d0: 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
a3e0: 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  le );.    if( p-
a3f0: 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  >isTable ){.    
a400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
a410: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
a420: 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
a430: 74 6f 54 61 72 67 65 74 2c 20 26 72 65 73 29 3b  toTarget, &res);
a440: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a450: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
a460: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
a470: 72 73 6f 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e  rsor,(char*)&p->
a480: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20  movetoTarget,.  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
a4b0: 6f 66 28 69 36 34 29 2c 26 72 65 73 29 3b 0a 20  of(i64),&res);. 
a4c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
a4d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
a4e0: 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20   *p->pIncrKey = 
a4f0: 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  0;.    p->lastRo
a500: 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70  wid = keyToInt(p
a510: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b  ->movetoTarget);
a520: 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56  .    p->rowidIsV
a530: 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20  alid = res==0;. 
a540: 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
a550: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a560: 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70  e3BtreeNext(p->p
a570: 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
a580: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
a590: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
a5a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
a5b0: 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70  h_count++;.    p
a5c0: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
a5d0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
a5e0: 68 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  heValid = 0;.  }
a5f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a600: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
a610: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
a620: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
a630: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
a640: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
a650: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
a660: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
a670: 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a  eSerialRead().**
a680: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
a690: 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
a6a0: 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74  e3VdbeSerialWrit
a6b0: 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  e().**.** encaps
a6c0: 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
a6d0: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
a6e0: 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
a6f0: 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
a700: 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
a710: 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
a720: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
a730: 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
a740: 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
a750: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
a760: 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
a770: 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
a780: 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
a790: 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
a7a0: 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
a7b0: 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
a7c0: 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
a7d0: 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
a7e0: 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
a7f0: 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
a800: 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
a810: 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
a820: 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
a830: 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
a840: 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
a850: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
a860: 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
a870: 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
a880: 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
a890: 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
a8a0: 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
a8b0: 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
a8c0: 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
a8d0: 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
a8e0: 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
a8f0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a900: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
a910: 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
a920: 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
a930: 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
a940: 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
a950: 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
a960: 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
a970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
a980: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
a990: 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
a9a0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
a9d0: 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
aa00: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
aa10: 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
aa30: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
aa40: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
aa50: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
aa60: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
aa70: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
aa80: 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
aab0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
aac0: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
aae0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
aaf0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
ab00: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
ab10: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
ab20: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
ab30: 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
ab60: 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
ab70: 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
ab80: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
ab90: 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
aba0: 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
abd0: 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
abe0: 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
ac10: 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
ac20: 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
ac30: 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
ac40: 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
ac50: 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
ac60: 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
ac70: 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
ac80: 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a   text.**.*/../*.
ac90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
aca0: 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
acb0: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
acc0: 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
acd0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ace0: 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
acf0: 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
ad00: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
ad10: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20  pMem->flags;..  
ad20: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
ad30: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
ad40: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
ad50: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
ad60: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
ad70: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
ad80: 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
ad90: 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
ada0: 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
adb0: 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30  (((i64)0x0000100
adc0: 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
add0: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a  64 i = pMem->i;.
ade0: 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
adf0: 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  f( file_format>=
ae00: 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b  4 && (i&1)==i ){
ae10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b  .      return 8+
ae20: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d  i;.    }.    u =
ae30: 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20   i<0 ? -i : i;. 
ae40: 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20     if( u<=127 ) 
ae50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
ae60: 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74  ( u<=32767 ) ret
ae70: 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75  urn 2;.    if( u
ae80: 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75  <=8388607 ) retu
ae90: 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 3;.    if( u<
aea0: 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65  =2147483647 ) re
aeb0: 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20  turn 4;.    if( 
aec0: 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72  u<=MAX_6BYTE ) r
aed0: 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74  eturn 5;.    ret
aee0: 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
aef0: 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
af00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  ){.    return 7;
af10: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
af20: 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
af30: 69 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  int n = pMem->n;
af40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  .    assert( n>=
af50: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
af60: 28 28 6e 2a 32 29 20 2b 20 31 33 29 3b 0a 20 20  ((n*2) + 13);.  
af70: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
af80: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65  M_Blob ){.    re
af90: 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20  turn (pMem->n*2 
afa0: 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74  + 12);.  }.  ret
afb0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
afc0: 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
afd0: 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
afe0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
aff0: 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
b000: 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  al-type..*/.int 
b010: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
b020: 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
b030: 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
b040: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
b050: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
b060: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
b070: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
b080: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
b090: 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
b0a0: 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
b0b0: 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
b0c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
b0d0: 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
b0e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  .  }.}../*.** Wr
b0f0: 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
b100: 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
b110: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
b120: 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
b130: 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
b140: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
b150: 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
b160: 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
b170: 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
b180: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
b190: 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20  tes written..*/ 
b1a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b1b0: 53 65 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e  SerialPut(unsign
b1c0: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 4d 65  ed char *buf, Me
b1d0: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
b1e0: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
b1f0: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
b200: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
b210: 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
b220: 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c  format);.  int l
b230: 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
b240: 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
b250: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
b260: 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
b270: 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
b280: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
b290: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
b2a0: 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==7 ){.      v =
b2b0: 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 72   *(u64*)&pMem->r
b2c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b2d0: 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70     v = *(u64*)&p
b2e0: 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 7d 0a 20 20  Mem->i;.    }.  
b2f0: 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
b300: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
b310: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
b320: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
b330: 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
b340: 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20  ] = (v&0xFF);.  
b350: 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
b360: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
b370: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
b380: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
b390: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
b3a0: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 6c 65 6e 20  >=12 ){.    len 
b3b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
b3c0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
b3d0: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6d 65 6d  l_type);.    mem
b3e0: 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
b3f0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
b400: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
b410: 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
b420: 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
b430: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b440: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
b450: 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
b460: 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
b470: 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
b480: 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
b490: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
b4a0: 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
b4b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
b4c0: 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
b4d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b4e0: 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
b4f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
b500: 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
b510: 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
b520: 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
b530: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
b540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b550: 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
b560: 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
b570: 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b590: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
b5a0: 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
b5b0: 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
b5c0: 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
b5d0: 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
b5e0: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
b5f0: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
b600: 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
b610: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
b620: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
b630: 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
b640: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
b650: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
b660: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b670: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
b680: 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
b690: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
b6a0: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 73      pMem->i = (s
b6b0: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
b6c0: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
b6d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
b6e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b6f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
b700: 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
b710: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
b720: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
b730: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
b740: 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
b750: 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [1];.      pMem-
b760: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b770: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
b780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b790: 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
b7a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
b7b0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20  /.      pMem->i 
b7c0: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
b7d0: 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
b7e0: 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
b7f0: 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
b800: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
b810: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
b820: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
b830: 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
b840: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
b850: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  */.      pMem->i
b860: 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
b870: 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
b880: 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
b890: 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[3];.      pMe
b8a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
b8b0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
b8c0: 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
b8d0: 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
b8e0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
b8f0: 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20   */.      u64 x 
b900: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
b910: 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
b920: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32  uf[1];.      u32
b930: 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34   y = (buf[2]<<24
b940: 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29  ) | (buf[3]<<16)
b950: 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c   | (buf[4]<<8) |
b960: 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78   buf[5];.      x
b970: 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
b980: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
b990: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
b9a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
b9b0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
b9c0: 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
b9d0: 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
b9e0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
b9f0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
ba00: 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
ba10: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
ba20: 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
ba30: 20 20 20 75 33 32 20 79 3b 0a 23 69 66 6e 64 65     u32 y;.#ifnde
ba40: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 2f  f NDEBUG.      /
ba50: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
ba60: 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
ba70: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
ba80: 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
ba90: 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
baa0: 72 2e 20 20 54 68 65 20 62 79 74 65 20 6f 72 64  r.  The byte ord
bab0: 65 72 20 64 69 66 66 65 72 73 20 6f 6e 20 73 6f  er differs on so
bac0: 6d 65 20 28 62 72 6f 6b 65 6e 29 20 61 72 63 68  me (broken) arch
bad0: 69 74 65 63 74 75 72 65 73 2e 0a 20 20 20 20 20  itectures..     
bae0: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
baf0: 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
bb00: 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
bb10: 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 61 73 73  )<<32;.      ass
bb20: 65 72 74 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62  ert( 1.0==*(doub
bb30: 6c 65 2a 29 26 74 31 20 29 3b 0a 23 65 6e 64 69  le*)&t1 );.#endi
bb40: 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
bb50: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
bb60: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
bb70: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
bb80: 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
bb90: 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
bba0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
bbb0: 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
bbc0: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
bbd0: 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
bbe0: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
bbf0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
bc00: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
bc10: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
bc20: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
bc30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc40: 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64     pMem->r = *(d
bc50: 6f 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20  ouble*)&x;.     
bc60: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
bc70: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
bc80: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
bc90: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  8;.    }.    cas
bca0: 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
bcb0: 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
bcc0: 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
bcd0: 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  r 1 */.      pMe
bce0: 6d 2d 3e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  m->i = serial_ty
bcf0: 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
bd00: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
bd10: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
bd20: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
bd30: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
bd40: 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
bd50: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
bd60: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
bd70: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
bd80: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
bd90: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
bda0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
bdb0: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
bdc0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
bdd0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
bde0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
bdf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
be00: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
be10: 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
be20: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
be30: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
be40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
be50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
be60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
be70: 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
be80: 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
be90: 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66  x records specif
bea0: 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79  ied by .** {nKey
beb0: 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e  1, pKey1} and {n
bec0: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65  Key2, pKey2}, re
bed0: 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69  turning a negati
bee0: 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
bef0: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
bf00: 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
bf10: 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
bf20: 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
bf30: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b  greater than {nK
bf40: 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f  ey2, pKey2}.  Bo
bf50: 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  th Key1 and Key2
bf60: 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74   must be byte st
bf70: 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65  rings.** compose
bf80: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
bf90: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
bfa0: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e   the VDBE..*/.in
bfb0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
bfc0: 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  ordCompare(.  vo
bfd0: 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20  id *userData,.  
bfe0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
bff0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
c000: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
c010: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
c020: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
c030: 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a  Info = (KeyInfo*
c040: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32  )userData;.  u32
c050: 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20   d1, d2;        
c060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
c070: 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
c080: 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
c090: 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32    u32 idx1, idx2
c0a0: 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  ;      /* Offset
c0b0: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
c0c0: 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
c0d0: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
c0e0: 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a  dr1, szHdr2;  /*
c0f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c100: 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
c110: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
c120: 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
c130: 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
c140: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
c150: 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
c160: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
c170: 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  y1;.  const unsi
c180: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32  gned char *aKey2
c190: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
c1a0: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b  ed char *)pKey2;
c1b0: 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20  ..  Mem mem1;.  
c1c0: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31  Mem mem2;.  mem1
c1d0: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
c1e0: 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63  >enc;.  mem2.enc
c1f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
c200: 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 73 71  ;.  .  idx1 = sq
c210: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
c220: 28 70 4b 65 79 31 2c 20 26 73 7a 48 64 72 31 29  (pKey1, &szHdr1)
c230: 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
c240: 0a 20 20 69 64 78 32 20 3d 20 73 71 6c 69 74 65  .  idx2 = sqlite
c250: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b 65  3GetVarint32(pKe
c260: 79 32 2c 20 26 73 7a 48 64 72 32 29 3b 0a 20 20  y2, &szHdr2);.  
c270: 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e  d2 = szHdr2;.  n
c280: 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
c290: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
c2a0: 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
c2b0: 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b  & idx2<szHdr2 ){
c2c0: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
c2d0: 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73  type1;.    u32 s
c2e0: 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20  erial_type2;..  
c2f0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
c300: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
c310: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
c320: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
c330: 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
c340: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  te3GetVarint32(&
c350: 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 26 73 65  aKey1[idx1], &se
c360: 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20  rial_type1);.   
c370: 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
c380: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
c390: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
c3a0: 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
c3b0: 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20  ak;.    idx2 += 
c3c0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
c3d0: 33 32 28 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c  32(&aKey2[idx2],
c3e0: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3b   &serial_type2);
c3f0: 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65  .    if( d2>=nKe
c400: 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y2 && sqlite3Vdb
c410: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
c420: 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29  erial_type2)>0 )
c430: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
c440: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 72  Assert that ther
c450: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
c460: 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68 20 6b  e left in each k
c470: 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20  ey for the blob 
c480: 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 74  of.    ** data t
c490: 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20 73 65  o go with the se
c4a0: 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74 20 72  rial type just r
c4b0: 65 61 64 2e 20 54 68 69 73 20 61 73 73 65 72 74  ead. This assert
c4c0: 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 20 20   may fail if.   
c4d0: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20   ** the file is 
c4e0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 6e  corrupted.  Then
c4f0: 20 72 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   read the value 
c500: 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 69 6e  from each key in
c510: 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61  to mem1.    ** a
c520: 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63 74 69  nd mem2 respecti
c530: 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vely..    */.   
c540: 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
c550: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
c560: 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
c570: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
c580: 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56    d2 += sqlite3V
c590: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
c5a0: 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f  ey2[d2], serial_
c5b0: 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a  type2, &mem2);..
c5c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c5d0: 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
c5e0: 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c  , &mem2, i<nFiel
c5f0: 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
c600: 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
c610: 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20   if( mem1.flags 
c620: 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  & MEM_Dyn ) sqli
c630: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
c640: 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66  e(&mem1);.    if
c650: 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d  ( mem2.flags & M
c660: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
c670: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
c680: 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72  mem2);.    if( r
c690: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
c6a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
c6b0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  ++;.  }..  /* On
c6c0: 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
c6d0: 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
c6e0: 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
c6f0: 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
c700: 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
c710: 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
c720: 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
c730: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
c740: 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
c750: 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
c760: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
c770: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
c780: 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
c790: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
c7a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c7b0: 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  d1<nKey1 ){.    
c7c0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
c7d0: 6c 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32  lse if( d2<nKey2
c7e0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d   ){.      rc = -
c7f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
c800: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
c810: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70  SortOrder && i<p
c820: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a  KeyInfo->nField.
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
c840: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
c850: 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
c860: 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a   rc = -rc;.  }..
c870: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c880: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
c890: 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65  nt is an index e
c8a0: 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73  ntry composed us
c8b0: 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
c8c0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
c8d0: 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   The last entry 
c8e0: 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20 73  in this record s
c8f0: 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
c900: 67 65 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c  ger (specificall
c910: 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  y.** an integer 
c920: 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f  rowid).  This ro
c930: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
c940: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
c950: 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74  s in.** that int
c960: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
c970: 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
c980: 4c 65 6e 28 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  Len(int nKey, co
c990: 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
c9a0: 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
c9b0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
c9c0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
c9d0: 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
c9e0: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
c9f0: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a  f the rowid */..
ca00: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
ca10: 6e 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64  nt32(aKey, &szHd
ca20: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
ca30: 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
ca40: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
ca50: 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
ca60: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ca70: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
ca80: 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  d);.}.  ../*.** 
ca90: 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
caa0: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
cab0: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
cac0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
cad0: 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
cae0: 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
caf0: 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
cb00: 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
cb10: 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
cb20: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
cb30: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
cb40: 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
cb50: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
cb60: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
cb70: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
cb80: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
cb90: 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
cba0: 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e  4 nCellKey;.  in
cbb0: 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
cbc0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
cbd0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
cbe0: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
cbf0: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
cc00: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
cc10: 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
cc20: 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
cc30: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
cc40: 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
cc50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
cc60: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
cc70: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
cc80: 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
cc90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
cca0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
ccb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
ccc0: 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
ccd0: 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
cce0: 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
ccf0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
cd00: 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   rc;.  }.  sqlit
cd10: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
cd20: 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b  8*)m.z, &szHdr);
cd30: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
cd40: 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
cd50: 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52  szHdr-1], &typeR
cd60: 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69  owid);.  lenRowi
cd70: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
cd80: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
cd90: 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  eRowid);.  sqlit
cda0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
cdb0: 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
cdc0: 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
cdd0: 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
cde0: 64 20 3d 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74  d = v.i;.  sqlit
cdf0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
ce00: 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
ce10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ce20: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
ce30: 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
ce40: 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
ce50: 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f  r pC is point to
ce60: 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
ce70: 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b  key string in pK
ce80: 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b  ey (of length nK
ce90: 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ey).  Write into
cea0: 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
ceb0: 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
cec0: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
ced0: 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
cee0: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
cef0: 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
cf00: 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52  er than pKey.  R
cf10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
cf20: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
cf30: 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72  * pKey is either
cf40: 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
cf50: 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
cf60: 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
cf70: 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
cf80: 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
cf90: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
cfa0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cfb0: 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
cfc0: 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
cfd0: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
cfe0: 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
cff0: 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43  re(.  Cursor *pC
d000: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d010: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
d020: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
d030: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  st */.  int nKey
d040: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79  , const u8 *pKey
d050: 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74  ,   /* The key t
d060: 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
d070: 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
d080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
d090: 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
d0a0: 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
d0b0: 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
d0c0: 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Key;.  int rc;. 
d0d0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
d0e0: 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
d0f0: 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20   int lenRowid;. 
d100: 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74   Mem m;..  sqlit
d110: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
d120: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
d130: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
d140: 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  =0 ){.    *res =
d150: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
d160: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
d170: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
d180: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
d190: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65  >pCursor, 0, nCe
d1a0: 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
d1b0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
d1c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
d1d0: 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
d1e0: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
d1f0: 6e 28 6d 2e 6e 2c 20 28 75 38 2a 29 6d 2e 7a 29  n(m.n, (u8*)m.z)
d200: 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  ;.  *res = sqlit
d210: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
d220: 61 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  are(pC->pKeyInfo
d230: 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20  , m.n-lenRowid, 
d240: 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29  m.z, nKey, pKey)
d250: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
d260: 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
d270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d280: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
d290: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
d2a0: 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
d2b0: 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
d2c0: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
d2d0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
d2e0: 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
d2f0: 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
d300: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d310: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
d320: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
d330: 6e 43 68 61 6e 67 65 29 7b 0a 20 20 64 62 2d 3e  nChange){.  db->
d340: 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
d350: 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
d360: 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
d370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
d380: 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
d390: 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
d3a0: 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
d3b0: 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
d3c0: 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
d3d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d3e0: 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
d3f0: 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
d400: 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
d410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
d420: 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
d430: 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
d440: 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
d450: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
d460: 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
d470: 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
d480: 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
d490: 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
d4a0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
d4b0: 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
d4c0: 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
d4d0: 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
d4e0: 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
d4f0: 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
d500: 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
d510: 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
d520: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
d530: 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
d540: 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
d550: 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
d560: 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
d570: 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
d580: 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
d590: 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
d5a0: 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
d5b0: 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
d5c0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
d5d0: 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
d5e0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
d5f0: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
d600: 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
d610: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
d620: 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
d630: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
d640: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
d650: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d660: 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
d670: 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
d680: 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
d690: 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a     eturn v->db;.}.