/ Hex Artifact Content
Login

Artifact e3a815a88bbf68f17880f5bc077e1c35d14b9409:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03d0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03e0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
0400: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0410: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0420: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0430: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0440: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0450: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0470: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
0480: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
0490: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04b0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04c0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
04d0: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
04e0: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
04f0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0500: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0510: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0520: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0530: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn p;.}../*.** T
0540: 75 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  urn tracing on o
0550: 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71  r off.*/.void sq
0560: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 56  lite3VdbeTrace(V
0570: 64 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72  dbe *p, FILE *tr
0580: 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65  ace){.  p->trace
0590: 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a   = trace;.}../*.
05a0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
05b0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
05c0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
05d0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
05e0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
05f0: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0600: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0610: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0620: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0630: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0640: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 20 0a  tain exactly N .
0650: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** elements..*/.
0660: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 69  static void resi
0670: 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  zeOpArray(Vdbe *
0680: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  p, int N){.  int
0690: 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d 61   runMode = p->ma
06a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
06b0: 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d 6f  RUN;.  if( runMo
06c0: 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  de || p->nOpAllo
06d0: 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  c<N ){.    VdbeO
06e0: 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  p *pNew;.    int
06f0: 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30 2a   nNew = N + 100*
0700: 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  (!runMode);.    
0710: 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d  int oldSize = p-
0720: 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  >nOpAlloc;.    p
0730: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0740: 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77  loc(p->aOp, nNew
0750: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0760: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0770: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0780: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d  = nNew;.      p-
0790: 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20  >aOp = pNew;.   
07a0: 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f 6c 64 53     if( nNew>oldS
07b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ize ){.        m
07c0: 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c  emset(&p->aOp[ol
07d0: 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e 4e 65 77  dSize], 0, (nNew
07e0: 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66  -oldSize)*sizeof
07f0: 28 4f 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (Op));.      }. 
0800: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0810: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0820: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0830: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0840: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0850: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0860: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0870: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0880: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0890: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
08a0: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
08b0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
08c0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
08d0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
08e0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
08f0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0900: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 20  **.**    p1, p2 
0910: 20 20 20 20 20 20 20 20 20 46 69 72 73 74 20 74           First t
0920: 77 6f 20 6f 66 20 74 68 65 20 74 68 72 65 65 20  wo of the three 
0930: 70 6f 73 73 69 62 6c 65 20 6f 70 65 72 61 6e 64  possible operand
0940: 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  s..**.** Use the
0950: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
0960: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
0970: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
0980: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
0990: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
09a0: 67 65 50 33 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP3() function 
09b0: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
09c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a  lue of the P3.**
09d0: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
09e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
09f0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  p(Vdbe *p, int o
0a00: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0a10: 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  2){.  int i;.  V
0a20: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69  dbeOp *pOp;..  i
0a30: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
0a40: 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  nOp++;.  assert(
0a50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0a60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0a70: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
0a80: 20 69 2b 31 29 3b 0a 20 20 69 66 28 20 73 71 6c   i+1);.  if( sql
0a90: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
0aa0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
0ab0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   0;.  }.  pOp = 
0ac0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0ad0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a  p->opcode = op;.
0ae0: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a    pOp->p1 = p1;.
0af0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a    pOp->p2 = p2;.
0b00: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
0b10: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
0b20: 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e  3_NOTUSED;.  p->
0b30: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66  expired = 0;.#if
0b40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0b50: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
0b60: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
0b70: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0b80: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0b90: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  Op[i]);.#endif. 
0ba0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
0bb0: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
0bc0: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
0bd0: 74 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f  the p3 value..*/
0be0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0bf0: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
0c00: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
0c10: 20 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   p2, const char 
0c20: 2a 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29  *zP3,int p3type)
0c30: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
0c40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0c50: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a  p, op, p1, p2);.
0c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
0c70: 6e 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP3(p, addr, z
0c80: 50 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72  P3, p3type);.  r
0c90: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
0ca0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
0cb0: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
0cc0: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
0cd0: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
0ce0: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
0cf0: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
0d00: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
0d10: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
0d20: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
0d30: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
0d40: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
0d50: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
0d60: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
0d70: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
0d80: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
0d90: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
0da0: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
0db0: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
0dc0: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
0dd0: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
0de0: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
0df0: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
0e00: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
0e10: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
0e30: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
0e40: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
0e50: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
0e60: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
0e70: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
0e80: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
0e90: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
0ea0: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
0eb0: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
0ec0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
0ed0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
0ee0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  resolved..**.** 
0ef0: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
0f00: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
0f10: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
0f20: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
0f30: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
0f40: 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c  t i;.  i = p->nL
0f50: 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74  abel++;.  assert
0f60: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0f70: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0f80: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65   if( i>=p->nLabe
0f90: 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  lAlloc ){.    p-
0fa0: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70  >nLabelAlloc = p
0fb0: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20  ->nLabelAlloc*2 
0fc0: 2b 20 31 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  + 10;.    sqlite
0fd0: 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28  3ReallocOrFree((
0fe0: 76 6f 69 64 2a 2a 29 26 70 2d 3e 61 4c 61 62 65  void**)&p->aLabe
0ff0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1010: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
1020: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1030: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1040: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1050: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
1060: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1070: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1080: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1090: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
10a0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
10b0: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
10c0: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
10d0: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
10e0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
10f0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1100: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1110: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1120: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
1130: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1140: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
1150: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
1160: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
1170: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1180: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1190: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
11a0: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
11b0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
11c0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
11d0: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
11e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
11f0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1200: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1210: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
1220: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
1230: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
1240: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
1250: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
1260: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
1270: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
1280: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
1290: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
12a0: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
12b0: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
12c0: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
12d0: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
12e0: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
12f0: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1300: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1310: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
1320: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
1330: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
1340: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
1350: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
1360: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
1370: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
1380: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
1390: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
13a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
13b0: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
13c0: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
13d0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
13e0: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
13f0: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1400: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1410: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1420: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
1430: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
1440: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
1450: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
1460: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
1470: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
1480: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
1490: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
14a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
14b0: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
14c0: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
14d0: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
14e0: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
14f0: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1500: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1510: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1520: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1530: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1540: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1550: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
1560: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
1570: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
1580: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
1590: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
15a0: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
15b0: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
15c0: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
15d0: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
15e0: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
15f0: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1600: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1610: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1620: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1630: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1640: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1650: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
1660: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
1670: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
1680: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 4e 4f 50  SH_MASK_0 + (NOP
1690: 55 53 48 5f 4d 41 53 4b 5f 31 3c 3c 31 36 29 2c  USH_MASK_1<<16),
16a0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
16b0: 5f 32 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53  _2 + (NOPUSH_MAS
16c0: 4b 5f 33 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f  K_3<<16),.    NO
16d0: 50 55 53 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 4e  PUSH_MASK_4 + (N
16e0: 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 3c 3c 31 36  OPUSH_MASK_5<<16
16f0: 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41  ),.    NOPUSH_MA
1700: 53 4b 5f 36 20 2b 20 28 4e 4f 50 55 53 48 5f 4d  SK_6 + (NOPUSH_M
1710: 41 53 4b 5f 37 3c 3c 31 36 29 2c 0a 20 20 20 20  ASK_7<<16),.    
1720: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1730: 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 3c 3c  (NOPUSH_MASK_9<<
1740: 31 36 29 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  16).  };.  retur
1750: 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d 20  n (masks[op>>5] 
1760: 26 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29 29  & (1<<(op&0x1F))
1770: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  );.}..#ifndef ND
1780: 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1790: 56 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73 68  VdbeOpcodeNoPush
17a0: 28 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75 72  (u8 op){.  retur
17b0: 6e 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f  n opcodeNoPush(o
17c0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
17d0: 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  .** Loop through
17e0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f   the program loo
17f0: 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75  king for P2 valu
1800: 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61  es that are nega
1810: 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73 75  tive..** Each su
1820: 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  ch value is a la
1830: 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68  bel.  Resolve th
1840: 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  e label by setti
1850: 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61 6c  ng the P2.** val
1860: 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  ue to its correc
1870: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  t non-zero value
1880: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1890: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
18a0: 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  nce after all op
18b0: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
18c0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  inserted..**.** 
18d0: 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75  Variable *pMaxFu
18e0: 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f  ncArgs is set to
18f0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
1900: 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67  ue of any P2 arg
1910: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20  ument .** to an 
1920: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 20 4f  OP_Function or O
1930: 50 5f 41 67 67 53 74 65 70 20 6f 70 63 6f 64 65  P_AggStep opcode
1940: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
1950: 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  y .** sqlite3Vdb
1960: 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20  eMakeReady() to 
1970: 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70  size the Vdbe.ap
1980: 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a  Arg[] array..**.
1990: 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 2a  ** The integer *
19a0: 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73 65 74  pMaxStack is set
19b0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
19c0: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 20 73  number of vdbe s
19d0: 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20  tack.** entries 
19e0: 74 68 61 74 20 73 74 61 74 69 63 20 61 6e 61 6c  that static anal
19f0: 79 73 69 73 20 72 65 76 65 61 6c 73 20 74 68 69  ysis reveals thi
1a00: 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68 74 20  s program might 
1a10: 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  need..**.** This
1a20: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
1a30: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
1a40: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20   optimization:  
1a50: 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20  It scans for.** 
1a60: 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Halt instruction
1a70: 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51 4c 49  s where P1==SQLI
1a80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6f 72  TE_CONSTRAINT or
1a90: 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f 72   P2==OE_Abort or
1aa0: 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73 65 72   for.** IdxInser
1ab0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77  t instructions w
1ac0: 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49 66 20  here P2!=0.  If 
1ad0: 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74  no such instruct
1ae0: 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ion is.** found,
1af0: 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74   then every Stat
1b00: 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  ement instructio
1b10: 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  n is changed to 
1b20: 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20 74  a Noop.  In.** t
1b30: 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
1b40: 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73  d creating the s
1b50: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1b60: 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61 72   file unnecessar
1b70: 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ily..*/.static v
1b80: 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  oid resolveP2Val
1b90: 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ues(Vdbe *p, int
1ba0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2c 20   *pMaxFuncArgs, 
1bb0: 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b  int *pMaxStack){
1bc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1bd0: 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20 20  nMaxArgs = 0;.  
1be0: 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20  int nMaxStack = 
1bf0: 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f  p->nOp;.  Op *pO
1c00: 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c  p;.  int *aLabel
1c10: 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20   = p->aLabel;.  
1c20: 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d 65 6e  int doesStatemen
1c30: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tRollback = 0;. 
1c40: 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d 65 6e   int hasStatemen
1c50: 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f  tBegin = 0;.  fo
1c60: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
1c70: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
1c80: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
1c90: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
1ca0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69  ->opcode;..    i
1cb0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75  f( opcode==OP_Fu
1cc0: 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65  nction || opcode
1cd0: 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a  ==OP_AggStep ){.
1ce0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1cf0: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
1d00: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
1d10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1d20: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29  pcode==OP_Halt )
1d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1d40: 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >p1==SQLITE_CONS
1d50: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
1d60: 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  2==OE_Abort ){. 
1d70: 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65         doesState
1d80: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  mentRollback = 1
1d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1da0: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1db0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 20 29 7b 0a  OP_IdxInsert ){.
1dc0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1dd0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65  2 ){.        doe
1de0: 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61  sStatementRollba
1df0: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
1e00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1e10: 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65  code==OP_Stateme
1e20: 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53  nt ){.      hasS
1e30: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20  tatementBegin = 
1e40: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
1e50: 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f  ( opcodeNoPush(o
1e60: 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20  pcode) ){.      
1e70: 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20  nMaxStack--;.   
1e80: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   }..    if( pOp-
1e90: 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75  >p2>=0 ) continu
1ea0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2d  e;.    assert( -
1eb0: 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61  1-pOp->p2<p->nLa
1ec0: 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  bel );.    pOp->
1ed0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
1ee0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73  Op->p2];.  }.  s
1ef0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61  qliteFree(p->aLa
1f00: 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65  bel);.  p->aLabe
1f10: 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46  l = 0;..  *pMaxF
1f20: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
1f30: 67 73 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b  gs;.  *pMaxStack
1f40: 20 3d 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20   = nMaxStack;.. 
1f50: 20 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20   /* If we never 
1f60: 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  rollback a state
1f70: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1f80: 2c 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  , then statement
1f90: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1fa0: 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  ns are not neede
1fb0: 64 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76  d.  So change ev
1fc0: 65 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ery OP_Statement
1fd0: 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74  .  ** opcode int
1fe0: 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54  o an OP_Noop.  T
1ff0: 68 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c  his avoid a call
2000: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
2010: 6e 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a  nExclusive().  *
2020: 2a 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 65  * which can be e
2030: 78 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65  xpensive on some
2040: 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f   platforms..  */
2050: 0a 20 20 69 66 28 20 68 61 73 53 74 61 74 65 6d  .  if( hasStatem
2060: 65 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65  entBegin && !doe
2070: 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61  sStatementRollba
2080: 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f  ck ){.    for(pO
2090: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
20a0: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
20b0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pOp++){.      i
20c0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
20d0: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  OP_Statement ){.
20e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
20f0: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
2100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2120: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2130: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
2140: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
2150: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
2160: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2170: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
2180: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
2190: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
21a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
21b0: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  nOp;.}../*.** Ad
21c0: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
21d0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
21e0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
21f0: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ack.  Return the
2200: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
2210: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
2220: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74  on added..*/.int
2230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2240: 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69  pList(Vdbe *p, i
2250: 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69  nt nOp, VdbeOpLi
2260: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a  st const *aOp){.
2270: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73    int addr;.  as
2280: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
2290: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
22a0: 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70 41 72 72  );.  resizeOpArr
22b0: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e  ay(p, p->nOp + n
22c0: 4f 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  Op);.  if( sqlit
22d0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
22e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
22f0: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70  ;.  }.  addr = p
2300: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70  ->nOp;.  if( nOp
2310: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  >0 ){.    int i;
2320: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
2330: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
2340: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2350: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
2360: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
2370: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
2380: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
2390: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
23a0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
23b0: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
23c0: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
23d0: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
23e0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
23f0: 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52  <0 ? addr + ADDR
2400: 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20  (p2) : p2;.     
2410: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d   pOut->p3 = pIn-
2420: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  >p3;.      pOut-
2430: 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70  >p3type = pIn->p
2440: 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20  3 ? P3_STATIC : 
2450: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64  P3_NOTUSED;.#ifd
2460: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2470: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2480: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
2490: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ce ){.        sq
24a0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
24b0: 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e  (0, i+addr, &p->
24c0: 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20  aOp[i+addr]);.  
24d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
24e0: 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d   }.    p->nOp +=
24f0: 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75   nOp;.  }.  retu
2500: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
2510: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2520: 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65  ue of the P1 ope
2530: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2540: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2550: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2560: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
2570: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
2580: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
2590: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
25a0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
25b0: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
25c0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
25d0: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
25e0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
25f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
2600: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2610: 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P1(Vdbe *p, int 
2620: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2630: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
2640: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2650: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
2660: 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e  & addr>=0 && p->
2670: 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61  nOp>addr && p->a
2680: 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  Op ){.    p->aOp
2690: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
26a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
26b0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
26c0: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
26d0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
26e0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
26f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2700: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
2710: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
2720: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
2730: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2740: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
2750: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2760: 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30    assert( val>=0
2770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2780: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2790: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
27a0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
27b0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
27c0: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
27d0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
27e0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  val;.  }.}.../*.
27f0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 33 20 76  ** Delete a P3 v
2800: 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72  alue if necessar
2810: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2820: 64 20 66 72 65 65 50 33 28 69 6e 74 20 70 33 74  d freeP3(int p3t
2830: 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a  ype, void *p3){.
2840: 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20 20 20    if( p3 ){.    
2850: 69 66 28 20 70 33 74 79 70 65 3d 3d 50 33 5f 44  if( p3type==P3_D
2860: 59 4e 41 4d 49 43 20 7c 7c 20 70 33 74 79 70 65  YNAMIC || p3type
2870: 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a  ==P3_KEYINFO ){.
2880: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
2890: 28 70 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (p3);.    }.    
28a0: 69 66 28 20 70 33 74 79 70 65 3d 3d 50 33 5f 56  if( p3type==P3_V
28b0: 44 42 45 46 55 4e 43 20 29 7b 0a 20 20 20 20 20  DBEFUNC ){.     
28c0: 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65   VdbeFunc *pVdbe
28d0: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
28e0: 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 73 71 6c   *)p3;.      sql
28f0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
2900: 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c  xData(pVdbeFunc,
2910: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2920: 65 46 72 65 65 28 70 56 64 62 65 46 75 6e 63 29  eFree(pVdbeFunc)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2940: 70 33 74 79 70 65 3d 3d 50 33 5f 4d 45 4d 20 29  p3type==P3_MEM )
2950: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2960: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
2970: 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20  3_value*)p3);.  
2980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
2990: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
29a0: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
29b0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
29c0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
29d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29e0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
29f0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
2a00: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
2a10: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
2a20: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
2a30: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
2a40: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
2a50: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
2a60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
2a70: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
2a80: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33  n>=0 then the P3
2a90: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
2aa0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
2ab0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
2ac0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
2ad0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
2ae0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
2af0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  teMalloc()..** A
2b00: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
2b10: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
2b20: 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64  of zP3 up to and
2b30: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
2b40: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
2b50: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
2b60: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
2b70: 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP3..**.** If 
2b80: 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69 74  n==P3_KEYINFO it
2b90: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20   means that zP3 
2ba0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2bb0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
2bc0: 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69  ure..** A copy i
2bd0: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65  s made of the Ke
2be0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
2bf0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
2c00: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
2c10: 69 74 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  iteMalloc, to be
2c20: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
2c30: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
2c40: 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49  d..** n==P3_KEYI
2c50: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
2c60: 63 61 74 65 73 20 74 68 61 74 20 7a 50 33 20 70  cates that zP3 p
2c70: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
2c80: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
2c90: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
2ca0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
2cb0: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
2cc0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e  om sqliteMalloc.
2cd0: 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   The .** caller 
2ce0: 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20  should not free 
2cf0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
2d00: 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
2d10: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
2d20: 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a  s.** finalized..
2d30: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
2d40: 75 65 73 20 6f 66 20 6e 20 28 50 33 5f 53 54 41  ues of n (P3_STA
2d50: 54 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 20  TIC, P3_COLLSEQ 
2d60: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
2d70: 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a 2a  hat zP3 points.*
2d80: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
2d90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2da0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2db0: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
2dc0: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
2dd0: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
2de0: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
2df0: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
2e00: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
2e10: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
2e20: 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P3 on the most 
2e30: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
2e40: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
2e50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2e60: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
2e70: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
2e80: 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69  nst char *zP3, i
2e90: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
2ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
2eb0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2ec0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2ed0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  ==0 || p->aOp==0
2ee0: 20 29 7b 0a 20 20 20 20 66 72 65 65 50 33 28 6e   ){.    freeP3(n
2ef0: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
2f00: 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 72 65 74  *)&zP3);.    ret
2f10: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  urn;.  }.  if( a
2f20: 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70  ddr<0 || addr>=p
2f30: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64 64  ->nOp ){.    add
2f40: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
2f50: 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
2f60: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
2f70: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
2f80: 72 5d 3b 0a 20 20 66 72 65 65 50 33 28 70 4f 70  r];.  freeP3(pOp
2f90: 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p3type, pOp->p
2fa0: 33 29 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  3);.  pOp->p3 = 
2fb0: 30 3b 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20  0;.  if( zP3==0 
2fc0: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  ){.    pOp->p3 =
2fd0: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74   0;.    pOp->p3t
2fe0: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
2ff0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
3000: 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P3_KEYINFO ){. 
3010: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
3020: 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46  Info;.    int nF
3030: 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20  ield, nByte;..  
3040: 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72    /* KeyInfo str
3050: 75 63 74 75 72 65 73 20 74 68 61 74 20 69 6e 63  uctures that inc
3060: 6c 75 64 65 20 61 6e 20 4b 65 79 49 6e 66 6f 2e  lude an KeyInfo.
3070: 61 53 6f 72 74 4f 72 64 65 72 20 61 72 65 20 61  aSortOrder are a
3080: 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 65 6e  lways.    ** sen
3090: 74 20 69 6e 20 75 73 69 6e 67 20 50 33 5f 4b 45  t in using P3_KE
30a0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2e 20 20  YINFO_HANDOFF.  
30b0: 54 68 65 20 4b 65 79 49 6e 66 6f 2e 61 53 6f 72  The KeyInfo.aSor
30c0: 74 4f 72 64 65 72 20 61 72 72 61 79 0a 20 20 20  tOrder array.   
30d0: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 75 70 6c 69   ** is not dupli
30e0: 63 61 74 65 64 20 77 68 65 6e 20 50 33 5f 4b 45  cated when P3_KE
30f0: 59 49 4e 46 4f 20 69 73 20 75 73 65 64 2e 20 2a  YINFO is used. *
3100: 2f 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  /.    /* assert(
3110: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
3120: 4f 72 64 65 72 3d 3d 30 20 29 3b 20 2a 2f 0a 20  Order==0 ); */. 
3130: 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65     nField = ((Ke
3140: 79 49 6e 66 6f 2a 29 7a 50 33 29 2d 3e 6e 46 69  yInfo*)zP3)->nFi
3150: 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  eld;.    nByte =
3160: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
3170: 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a  o) + (nField-1)*
3180: 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d  sizeof(pKeyInfo-
3190: 3e 61 43 6f 6c 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aColl[0]);.    
31a0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
31b0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74  eMallocRaw( nByt
31c0: 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  e );.    pOp->p3
31d0: 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e   = (char*)pKeyIn
31e0: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
31f0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65  Info ){.      me
3200: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a  mcpy(pKeyInfo, z
3210: 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  P3, nByte);.    
3220: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3230: 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20  P3_KEYINFO;.    
3240: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70  }else{.      pOp
3250: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f  ->p3type = P3_NO
3260: 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  TUSED;.    }.  }
3270: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b  else if( n==P3_K
3280: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29  EYINFO_HANDOFF )
3290: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  {.    pOp->p3 = 
32a0: 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20  (char*)zP3;.    
32b0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
32c0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
32d0: 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20  e if( n<0 ){.   
32e0: 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72   pOp->p3 = (char
32f0: 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP3;.    pOp->
3300: 70 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65  p3type = n;.  }e
3310: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
3320: 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  0 ) n = strlen(z
3330: 50 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  P3);.    pOp->p3
3340: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
3350: 28 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f  (zP3, n);.    pO
3360: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44  p->p3type = P3_D
3370: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23  YNAMIC;.  }.}..#
3380: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
3390: 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
33a0: 50 33 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P3 field of the 
33b0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
33c0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ded instruction 
33d0: 77 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20  with.** comment 
33e0: 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  text..*/.void sq
33f0: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
3400: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
3410: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
3420: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
3430: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
3440: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
3450: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
3460: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3470: 2e 70 33 3d 3d 30 20 29 3b 0a 20 20 76 61 5f 73  .p3==0 );.  va_s
3480: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
3490: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
34a0: 43 68 61 6e 67 65 50 33 28 70 2c 20 2d 31 2c 20  ChangeP3(p, -1, 
34b0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
34c0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33  zFormat, ap), P3
34d0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f  _DYNAMIC);.  va_
34e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69  end(ap);.}.#endi
34f0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
3500: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
3510: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
3520: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
3530: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
3540: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3560: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3570: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
3580: 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72   addr>=0 && addr
3590: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74  <p->nOp );.  ret
35a0: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
35b0: 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  ];.}..#if !defin
35c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
35d0: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
35e0: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
35f0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
3600: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
3610: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
3620: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
3630: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
3640: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
3650: 33 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  3 parameter for 
3660: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
3670: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
3680: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
3690: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
36a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
36b0: 2a 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70  *displayP3(Op *p
36c0: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
36d0: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
36e0: 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65  har *zP3;.  asse
36f0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
3700: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
3710: 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p3type ){.    ca
3720: 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P3_KEYINFO: {
3730: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
3740: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
3750: 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49  pKeyInfo = (KeyI
3760: 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  nfo*)pOp->p3;.  
3770: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d      sprintf(zTem
3780: 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c  p, "keyinfo(%d",
3790: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
37a0: 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74  d);.      i = st
37b0: 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20  rlen(zTemp);.   
37c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
37d0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
37e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
37f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
3800: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
3810: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
3820: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
3830: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
3840: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
3850: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
3860: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
3870: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
3880: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
3890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
38a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
38b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  }.          zTem
38c0: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
38d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
38e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
38f0: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
3900: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
3910: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
3920: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
3930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3940: 20 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70     strcpy(&zTemp
3950: 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  [i], pColl->zNam
3960: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  e);.          i 
3970: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  += n;.        }e
3980: 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d  lse if( i+4<nTem
3990: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
39a0: 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69   strcpy(&zTemp[i
39b0: 5d 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20  ],",nil");.     
39c0: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
39d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
39e0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
39f0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
3a00: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
3a10: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
3a20: 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20   );.      zP3 = 
3a30: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
3a40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3a50: 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P3_COLLSEQ: {
3a60: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
3a70: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
3a80: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
3a90: 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20   sprintf(zTemp, 
3aa0: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
3ab0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
3ac0: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
3ad0: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
3ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3af0: 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P3_FUNCDEF: {.  
3b00: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
3b10: 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f  f = (FuncDef*)pO
3b20: 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 63 68 61  p->p3;.      cha
3b30: 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20  r zNum[30];.    
3b40: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
3b50: 20 22 25 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c 20   "%.*s", nTemp, 
3b60: 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pDef->zName);.  
3b70: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d      sprintf(zNum
3b80: 2c 22 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 6e  ,"(%d)", pDef->n
3b90: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
3ba0: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 2b 73 74  strlen(zTemp)+st
3bb0: 72 6c 65 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e 54  rlen(zNum)+1<=nT
3bc0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
3bd0: 74 72 63 61 74 28 7a 54 65 6d 70 2c 20 7a 4e 75  trcat(zTemp, zNu
3be0: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
3bf0: 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP3 = zTemp;. 
3c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3c10: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
3c20: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70  .      zP3 = pOp
3c30: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p3;.      if( 
3c40: 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f  zP3==0 || pOp->o
3c50: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  pcode==OP_Noop )
3c60: 7b 0a 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20  {.        zP3 = 
3c70: 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  "";.      }.    
3c80: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
3c90: 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  P3;.}.#endif...#
3ca0: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
3cb0: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
3cc0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
3cd0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
3ce0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
3cf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3d00: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
3d10: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
3d20: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
3d30: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
3d40: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
3d50: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20  {.  char *zP3;. 
3d60: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
3d70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
3d80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
3d90: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
3da0: 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  4d %s\n";.  if( 
3db0: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
3dc0: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d   stdout;.  zP3 =
3dd0: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
3de0: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
3df0: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
3e00: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20  Out, zFormat1,. 
3e10: 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33       pc, sqlite3
3e20: 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d  OpcodeNames[pOp-
3e30: 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70  >opcode], pOp->p
3e40: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29  1, pOp->p2, zP3)
3e50: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
3e60: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3e70: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
3e80: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
3e90: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
3ea0: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
3eb0: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
3ec0: 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  N){.  if( p ){. 
3ed0: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20     while( N-->0 
3ee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3ef0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
3f00: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ++);.    }.  }.}
3f10: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3f20: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
3f30: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
3f40: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
3f50: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
3f60: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
3f70: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
3f80: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
3f90: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
3fa0: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
3fb0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
3fc0: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
3fd0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
3fe0: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
3ff0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4000: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
4010: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
4020: 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73  PLAIN"..*/.int s
4030: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
4040: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
4050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4060: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
4070: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4080: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
4090: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
40a0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
40b0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  ->explain );.  i
40c0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
40d0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65  E_MAGIC_RUN ) re
40e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
40f0: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  SE;.  assert( db
4100: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
4110: 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20  MAGIC_BUSY );.  
4120: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
4130: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
4140: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
4150: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
4160: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
4170: 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e  does not put dyn
4180: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74  amic strings ont
4190: 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73  o the.  ** the s
41a0: 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62  tack, they may b
41b0: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
41c0: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
41d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
41e0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
41f0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
4200: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
4210: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  coding..  */.  i
4220: 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e  f( p->pTos==&p->
4230: 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20  aStack[4] ){.   
4240: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
4250: 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a  (p->aStack, 5);.
4260: 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74    }.  p->resOnSt
4270: 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a  ack = 0;..  do{.
4280: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
4290: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e  .  }while( i<p->
42a0: 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  nOp && p->explai
42b0: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
42c0: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
42d0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
42e0: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
42f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
4300: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
4310: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
4320: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
4330: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
4340: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
4350: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
4360: 65 72 72 75 70 74 3b 0a 20 20 20 20 70 2d 3e 72  errupt;.    p->r
4370: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
4380: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
4390: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
43a0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
43b0: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
43c0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
43d0: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
43e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
43f0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
4400: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
4410: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
4420: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
4430: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
4440: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
4450: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
4460: 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20  em->i = i;      
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
4490: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
44a0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
44b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
44c0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
44d0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
44e0: 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65  pMem->z = sqlite
44f0: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70  3OpcodeNames[pOp
4500: 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f  ->opcode];  /* O
4510: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65  pcode */.    pMe
4520: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
4530: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
4540: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
4550: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
4560: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
4570: 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  8;.    pMem++;..
4580: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
4590: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
45a0: 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31  Mem->i = pOp->p1
45b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
45c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
45d0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
45e0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
45f0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
4600: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
4610: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
4620: 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e   pMem->i = pOp->
4630: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4650: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
4660: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
4670: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
4680: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
4690: 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c  ags = MEM_Short|
46a0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
46b0: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
46c0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
46d0: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
46e0: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
46f0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
4700: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
4710: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
4720: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
4730: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
4740: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
4750: 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 2*(p->explain
4760: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  -1);.    p->pTos
4770: 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e   = pMem;.    p->
4780: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4790: 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63      p->resOnStac
47a0: 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
47b0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
47c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
47d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
47e0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
47f0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
4800: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
4810: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
4820: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
4830: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4840: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
4850: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
4860: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  TE_DEBUG.  int n
4870: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
4880: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
4890: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
48a0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
48b0: 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20  p[nOp-1];.  if( 
48c0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
48d0: 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21  Noop && pOp->p3!
48e0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
48f0: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
4900: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  3;.    while( is
4910: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29  space(*(u8*)z) )
4920: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
4930: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
4940: 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
4950: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
4960: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
4970: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e  e for execution.
4980: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
4990: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
49a0: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61  s allocating sta
49b0: 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69  ck space and ini
49c0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
49d0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
49e0: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
49f0: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
4a00: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
4a10: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
4a20: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
4a30: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
4a40: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  .  .**.** This i
4a50: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
4a60: 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72  o move a VDBE fr
4a70: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  om VDBE_MAGIC_IN
4a80: 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  IT to.** VDBE_MA
4a90: 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64  GIC_RUN..*/.void
4aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4ab0: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
4ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ad0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
4ae0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  DBE */.  int nVa
4af0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
4b00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b10: 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20  r of '?' see in 
4b20: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
4b30: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c  t */.  int nMem,
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4b60: 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
4b70: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
4b80: 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20   int nCursor,   
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
4bb0: 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  sors to allocate
4bc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
4bd0: 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ain             
4be0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4bf0: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
4c00: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
4c10: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  */.){.  int n;..
4c20: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4c40: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4c50: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
4c60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
4c70: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
4c80: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
4c90: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
4ca0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
4cb0: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
4cc0: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
4cd0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 54  er than later. T
4ce0: 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63 61  his.   * is beca
4cf0: 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
4d00: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29 20  resizeOpArray() 
4d10: 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b  below may shrink
4d20: 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70   the.   * p->aOp
4d30: 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76 65  [] array to save
4d40: 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65   memory if calle
4d50: 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d  d when in VDBE_M
4d60: 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73  AGIC_RUN .   * s
4d70: 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d  tate..   */.  p-
4d80: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
4d90: 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e  GIC_RUN;..  /* N
4da0: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76  o instruction ev
4db0: 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74  er pushes more t
4dc0: 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  han a single ele
4dd0: 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20  ment onto the.  
4de0: 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74  ** stack.  And t
4df0: 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67  he stack never g
4e00: 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69  rows on successi
4e10: 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66  ve executions of
4e20: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c   the.  ** same l
4e30: 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74  oop.  So the tot
4e40: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73  al number of ins
4e50: 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20  tructions is an 
4e60: 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a  upper bound.  **
4e70: 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   on the maximum 
4e80: 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71 75  stack depth requ
4e90: 69 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c 61  ired.  (Added la
4ea0: 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20  ter:)  The.  ** 
4eb0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
4ec0: 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20  ) call computes 
4ed0: 61 20 74 69 67 68 74 65 72 20 75 70 70 65 72 20  a tighter upper 
4ee0: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a  bound on the.  *
4ef0: 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20  * stack size..  
4f00: 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69  **.  ** Allocati
4f10: 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b  on all the stack
4f20: 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65   space we will e
4f30: 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20  ver need..  */. 
4f40: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d   if( p->aStack==
4f50: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
4f60: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
4f70: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
4f80: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
4f90: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
4fa0: 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b  .    int nStack;
4fb0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
4fc0: 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b 20  number of stack 
4fd0: 65 6e 74 72 69 65 73 20 72 65 71 75 69 72 65 64  entries required
4fe0: 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50   */.    resolveP
4ff0: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
5000: 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20  , &nStack);.    
5010: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
5020: 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73   p->nOp);.    as
5030: 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b  sert( nVar>=0 );
5040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 74  .    assert( nSt
5050: 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ack<p->nOp );.  
5060: 20 20 6e 53 74 61 63 6b 20 3d 20 69 73 45 78 70    nStack = isExp
5070: 6c 61 69 6e 20 3f 20 31 30 20 3a 20 6e 53 74 61  lain ? 10 : nSta
5080: 63 6b 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63  ck;.    p->aStac
5090: 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  k = sqliteMalloc
50a0: 28 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b  (.        nStack
50b0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63  *sizeof(p->aStac
50c0: 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61  k[0])    /* aSta
50d0: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41  ck */.      + nA
50e0: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20  rg*sizeof(Mem*) 
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5100: 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b  apArg */.      +
5110: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
5120: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
5130: 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20  /* aVar */.     
5140: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63   + nVar*sizeof(c
5150: 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20  har*)           
5160: 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20    /* azVar */.  
5170: 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f      + nMem*sizeo
5180: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
5190: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a       /* aMem */.
51a0: 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a        + nCursor*
51b0: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20  sizeof(Cursor*) 
51c0: 20 20 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20         /* apCsr 
51d0: 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  */.    );.    if
51e0: 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ( !sqlite3_mallo
51f0: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
5200: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e    p->aMem = &p->
5210: 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b 5d 3b 0a  aStack[nStack];.
5220: 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
5230: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nMem;.      p->a
5240: 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e  Var = &p->aMem[n
5250: 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  Mem];.      p->n
5260: 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20  Var = nVar;.    
5270: 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a    p->okVar = 0;.
5280: 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
5290: 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72   (Mem**)&p->aVar
52a0: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
52b0: 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a  >azVar = (char**
52c0: 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d  )&p->apArg[nArg]
52d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
52e0: 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d   = (Cursor**)&p-
52f0: 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20  >azVar[nVar];.  
5300: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
5310: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   nCursor;.      
5320: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
5330: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
5340: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
5350: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
5360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5370: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d  for(n=0; n<p->nM
5380: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d  em; n++){.    p-
5390: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
53a0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a   MEM_Null;.  }..
53b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
53c0: 42 55 47 0a 20 20 69 66 28 20 28 70 2d 3e 64 62  BUG.  if( (p->db
53d0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
53e0: 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30  _VdbeListing)!=0
53f0: 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4f  .    || sqlite3O
5400: 73 46 69 6c 65 45 78 69 73 74 73 28 22 76 64 62  sFileExists("vdb
5410: 65 5f 65 78 70 6c 61 69 6e 22 29 0a 20 20 29 7b  e_explain").  ){
5420: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
5430: 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72 6f  printf("VDBE Pro
5440: 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e 22  gram Listing:\n"
5450: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5460: 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20  bePrintSql(p);. 
5470: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5480: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
54a0: 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c 20  ntOp(stdout, i, 
54b0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
54c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
54d0: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
54e0: 28 22 76 64 62 65 5f 74 72 61 63 65 22 29 20 29  ("vdbe_trace") )
54f0: 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 20 3d  {.    p->trace =
5500: 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e   stdout;.  }.#en
5510: 64 69 66 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20  dif.  p->pTos = 
5520: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
5530: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
5540: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
5550: 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e  K;.  p->uniqueCn
5560: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75  t = 0;.  p->retu
5570: 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  rnDepth = 0;.  p
5580: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
5590: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70  OE_Abort;.  p->p
55a0: 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20  opStack =  0;.  
55b0: 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73  p->explain |= is
55c0: 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61  Explain;.  p->ma
55d0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
55e0: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
55f0: 67 65 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  ge = 0;.#ifdef V
5600: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
5610: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
5620: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
5630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
5640: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
5650: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
5660: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20  .cycles = 0;.   
5670: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
5680: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
5690: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
56a0: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
56b0: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
56c0: 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f  happens.** to ho
56d0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
56e0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
56f0: 72 28 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  r(Cursor *pCx){.
5700: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
5710: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5720: 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73    if( pCx->pCurs
5730: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
5740: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
5750: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
5760: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
5770: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
5780: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
5790: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ->pBt);.  }.  sq
57a0: 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 70 44  liteFree(pCx->pD
57b0: 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ata);.  sqliteFr
57c0: 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 0a  ee(pCx->aType);.
57d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 78    sqliteFree(pCx
57e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
57f0: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a 2f  e all cursors.*/
5800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
5810: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
5820: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
5830: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d    if( p->apCsr==
5840: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
5850: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
5860: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  sor; i++){.    s
5870: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
5880: 72 73 6f 72 28 70 2d 3e 61 70 43 73 72 5b 69 5d  rsor(p->apCsr[i]
5890: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 5b  );.    p->apCsr[
58a0: 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = 0;.  }.}../
58b0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
58c0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
58d0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
58e0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
58f0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
5900: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
5910: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
5920: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
5930: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
5940: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
5950: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
5960: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
5970: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
5980: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
5990: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
59a0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
59b0: 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72  >aStack ){.    r
59c0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
59d0: 2d 3e 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70  ->aStack, 1 + (p
59e0: 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61  ->pTos - p->aSta
59f0: 63 6b 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f  ck));.    p->pTo
5a00: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d  s = &p->aStack[-
5a10: 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  1];.  }.  closeA
5a20: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
5a30: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5a40: 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
5a50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5a60: 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46  FifoClear(&p->sF
5a70: 69 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63  ifo);.  if( p->c
5a80: 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20  ontextStack ){. 
5a90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5aa0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
5ab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
5ac0: 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65  lite3VdbeFifoCle
5ad0: 61 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ar(&p->contextSt
5ae0: 61 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20  ack[i].sFifo);. 
5af0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
5b00: 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ree(p->contextSt
5b10: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ack);.  }.  p->c
5b20: 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b  ontextStack = 0;
5b30: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
5b40: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  ckDepth = 0;.  p
5b50: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
5b60: 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46  p = 0;.  sqliteF
5b70: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
5b80: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
5b90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
5ba0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
5bb0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
5bc0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
5bd0: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
5be0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
5bf0: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
5c00: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
5c10: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
5c20: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
5c30: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
5c40: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
5c50: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
5c60: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
5c70: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
5c80: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
5c90: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
5ca0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5cb0: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
5cc0: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
5cd0: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
5ce0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
5cf0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 2d 3e 6e   assert( 0==p->n
5d00: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70  ResColumn );.  p
5d10: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e  ->nResColumn = n
5d20: 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 6e 20 3d  ResColumn;.  n =
5d30: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 32 3b 0a 20   nResColumn*2;. 
5d40: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
5d50: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
5d60: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5d70: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
5d80: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
5d90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5da0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
5db0: 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61 6d 65 2b  {.    (pColName+
5dc0: 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  +)->flags = MEM_
5dd0: 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Null;.  }.}../*.
5de0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
5df0: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
5e00: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
5e10: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
5e20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
5e30: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
5e40: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
5e50: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
5e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
5e70: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
5e80: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
5e90: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
5ea0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ols()..**.** If 
5eb0: 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74  N==P3_STATIC  it
5ec0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d   means that zNam
5ed0: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
5ee0: 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61  o a constant sta
5ef0: 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e  tic.** string an
5f00: 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  d we can just co
5f10: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20  py the pointer. 
5f20: 49 66 20 69 74 20 69 73 20 50 33 5f 44 59 4e 41  If it is P3_DYNA
5f30: 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  MIC, then .** th
5f40: 65 20 73 74 72 69 6e 67 20 69 73 20 66 72 65 65  e string is free
5f50: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 46 72  d using sqliteFr
5f60: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
5f70: 62 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77  be is finished w
5f80: 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72  ith.** it. Other
5f90: 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66  wise, N bytes of
5fa0: 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65   zName are copie
5fb0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5fc0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
5fd0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  Vdbe *p, int idx
5fe0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5ff0: 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ame, int N){.  i
6000: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
6010: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
6020: 28 20 69 64 78 3c 28 32 2a 70 2d 3e 6e 52 65 73  ( idx<(2*p->nRes
6030: 43 6f 6c 75 6d 6e 29 20 29 3b 0a 20 20 69 66 28  Column) );.  if(
6040: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
6050: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  failed ) return 
6060: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6070: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
6080: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
6090: 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
60a0: 4e 61 6d 65 5b 69 64 78 5d 29 3b 0a 20 20 69 66  Name[idx]);.  if
60b0: 28 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20  ( N==P3_DYNAMIC 
60c0: 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20  || N==P3_STATIC 
60d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
60e0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
60f0: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
6100: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
6110: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
6120: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6130: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
6140: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
6150: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51  me, zName, N, SQ
6160: 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
6170: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
6180: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6190: 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59  E_OK && N==P3_DY
61a0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f  NAMIC ){.    pCo
61b0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28  lName->flags = (
61c0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
61d0: 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d  (~MEM_Static))|M
61e0: 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c  EM_Dyn;.    pCol
61f0: 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  Name->xDel = 0;.
6200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
6220: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
6230: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
6240: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
6250: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
6260: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
6270: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
6280: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
6290: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
62a0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
62b0: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
62c0: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
62d0: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
62e0: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
62f0: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
6300: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
6310: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
6320: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
6330: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6340: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
6350: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
6360: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
6370: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
6380: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
6390: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
63a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
63b0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
63c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
63d0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
63e0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
63f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6400: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6410: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6420: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
6430: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
6440: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
6450: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
6460: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
6470: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
6480: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
6490: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
64a0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
64b0: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
64c0: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
64d0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
64e0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
64f0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
6500: 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62  db);.    rc = db
6510: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
6520: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
6530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  );.    sqlite3Sa
6540: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20  fetyOn(db);.    
6550: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
6560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6570: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
6580: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
6590: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
65a0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
65b0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
65c0: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
65d0: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
65e0: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
65f0: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
6600: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
6610: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
6620: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
6630: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
6640: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
6650: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
6660: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
6670: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
6680: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
6690: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
66a0: 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20  s :memory:.  In 
66b0: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 0a  that case we do.
66c0: 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74    ** not support
66d0: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
66e0: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
66f0: 73 65 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61  se the simple ca
6700: 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f  se then.  ** too
6710: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
6720: 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74  strlen(sqlite3Bt
6730: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
6740: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20  b->aDb[0].pBt)) 
6750: 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a  || nTrans<=1 ){.
6760: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
6770: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
6780: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
6790: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
67a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
67b0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
67c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
67d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
67e0: 63 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  c(pBt, 0);.     
67f0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
6800: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
6810: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
6820: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
6830: 79 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 20 20  y synced */.    
6840: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6850: 4b 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  K ){.      for(i
6860: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6870: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 74 72  ++){.        Btr
6880: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
6890: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
68a0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
68b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
68c0: 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
68d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
68e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
68f0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
6900: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
6910: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
6930: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
6940: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
6950: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
6960: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
6970: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
6980: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
6990: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
69a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
69b0: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
69c0: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
69d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
69e0: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
69f0: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
6a00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
6a10: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
6a20: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
6a30: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
6a40: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
6a50: 2e 70 42 74 29 3b 0a 20 20 20 20 4f 73 46 69 6c  .pBt);.    OsFil
6a60: 65 20 6d 61 73 74 65 72 3b 0a 0a 20 20 20 20 2f  e master;..    /
6a70: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
6a80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
6a90: 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a  ame */.    do {.
6aa0: 20 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d        u32 random
6ab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
6ac0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
6ad0: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
6ae0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64  ness(sizeof(rand
6af0: 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20  om), &random);. 
6b00: 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73       zMaster = s
6b10: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
6b20: 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e  s-mj%08X", zMain
6b30: 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37  File, random&0x7
6b40: 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
6b50: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a  if( !zMaster ){.
6b60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
6b70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6b80: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
6b90: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
6ba0: 69 73 74 73 28 7a 4d 61 73 74 65 72 29 20 29 3b  ists(zMaster) );
6bb0: 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
6bc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6bd0: 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  . */.    memset(
6be0: 26 6d 61 73 74 65 72 2c 20 30 2c 20 73 69 7a 65  &master, 0, size
6bf0: 6f 66 28 6d 61 73 74 65 72 29 29 3b 0a 20 20 20  of(master));.   
6c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
6c10: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d 61  penExclusive(zMa
6c20: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20 30  ster, &master, 0
6c30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
6c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6c50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
6c60: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
6c70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
6c80: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
6c90: 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
6ca0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
6cb0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
6cc0: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
6cd0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
6ce0: 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
6cf0: 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
6d00: 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
6d10: 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
6d20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6d30: 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
6d40: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
6d50: 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
6d60: 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
6d70: 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
6d80: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
6d90: 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
6da0: 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
6db0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
6dc0: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
6dd0: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
6de0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
6df0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
6e00: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
6e10: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
6e20: 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f     if( i==1 ) co
6e30: 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e  ntinue;   /* Ign
6e40: 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ore the TEMP dat
6e50: 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  abase */.      i
6e60: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
6e70: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
6e80: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
6e90: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
6ea0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
6eb0: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
6ec0: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
6ed0: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63   zFile[0]==0 ) c
6ee0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
6ef0: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  ore :memory: dat
6f00: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
6f10: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
6f20: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
6f30: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
6f40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
6f50: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
6f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
6f70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6f80: 74 65 28 26 6d 61 73 74 65 72 2c 20 7a 46 69 6c  te(&master, zFil
6f90: 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  e, strlen(zFile)
6fa0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
6fb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6fc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6fd0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
6fe0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
6ff0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
7000: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
7010: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
7020: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
7030: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7050: 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79     }...    /* Sy
7060: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
7070: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f  urnal file. Befo
7080: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f  re doing this, o
7090: 70 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  pen the director
70a0: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73  y.    ** the mas
70b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
70c0: 20 69 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20   is store in so 
70d0: 74 68 61 74 20 69 74 20 67 65 74 73 20 73 79 6e  that it gets syn
70e0: 63 65 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ced too..    */.
70f0: 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20      zMainFile = 
7100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
7110: 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  irname(db->aDb[0
7120: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  ].pBt);.    rc =
7130: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
7140: 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c  rectory(zMainFil
7150: 65 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 20  e, &master);.   
7160: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7170: 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  OK ||.          
7180: 28 6e 65 65 64 53 79 6e 63 20 26 26 20 28 72 63  (needSync && (rc
7190: 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26  =sqlite3OsSync(&
71a0: 6d 61 73 74 65 72 2c 30 29 29 21 3d 53 51 4c 49  master,0))!=SQLI
71b0: 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
71c0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
71d0: 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  master);.      s
71e0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
71f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
7200: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
7210: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
7220: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
7230: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
7240: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
7250: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
7260: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
7270: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
7280: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7290: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
72a0: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
72b0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
72c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
72d0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
72e0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
72f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
7300: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
7310: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
7320: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
7330: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7340: 42 74 72 65 65 53 79 6e 63 28 29 2c 0a 20 20 20  BtreeSync(),.   
7350: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
7360: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
7370: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7380: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a  al file will be.
7390: 20 20 20 20 2a 2a 20 6f 72 70 68 61 6e 65 64 2e      ** orphaned.
73a0: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
73b0: 65 6c 65 74 65 20 69 74 2c 20 69 6e 20 63 61 73  elete it, in cas
73c0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
73d0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
73e0: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
73f0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
7400: 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  al file before t
7410: 68 65 20 66 61 69 6c 75 72 65 0a 20 20 20 20 2a  he failure.    *
7420: 2a 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a  * occured..    *
7430: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
7440: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
7450: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
7460: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
7470: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
7480: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
7490: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
74a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
74b0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
74c0: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
74d0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
74e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
74f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
7500: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
7510: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7520: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
7530: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7540: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
7550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7560: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7570: 6d 61 73 74 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  master);..    /*
7580: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
7590: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
75a0: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
75b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
75c0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
75d0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
75e0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
75f0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
7600: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
7610: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
7620: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
7630: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
7640: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7650: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (zMaster);.    a
7660: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
7670: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69  E_OK );.    sqli
7680: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
7690: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
76a0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
76b0: 65 33 4f 73 53 79 6e 63 44 69 72 65 63 74 6f 72  e3OsSyncDirector
76c0: 79 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  y(zMainFile);.  
76d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
76e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
76f0: 54 68 69 73 20 69 73 20 6e 6f 74 20 67 6f 6f 64  This is not good
7700: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
7710: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
7720: 65 6e 20 64 65 6c 65 74 65 64 2c 20 62 75 74 0a  en deleted, but.
7730: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 72        ** the dir
7740: 65 63 74 6f 72 79 20 73 79 6e 63 20 66 61 69 6c  ectory sync fail
7750: 65 64 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ed. There is no 
7760: 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 66 65 20  completely safe 
7770: 63 6f 75 72 73 65 20 6f 66 0a 20 20 20 20 20 20  course of.      
7780: 2a 2a 20 61 63 74 69 6f 6e 20 66 72 6f 6d 20 68  ** action from h
7790: 65 72 65 2e 20 54 68 65 20 69 6e 64 69 76 69 64  ere. The individ
77a0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e  ual journals con
77b0: 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
77c0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61   the.      ** ma
77d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
77e0: 65 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20  e, but there is 
77f0: 6e 6f 20 77 61 79 20 6f 66 20 6b 6e 6f 77 69 6e  no way of knowin
7800: 67 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  g if that.      
7810: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
7820: 6c 20 65 78 69 73 74 73 20 6e 6f 77 20 6f 72 20  l exists now or 
7830: 69 66 20 69 74 20 77 69 6c 6c 20 65 78 69 73 74  if it will exist
7840: 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
7850: 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 73 79  ting.      ** sy
7860: 73 74 65 6d 20 63 72 61 73 68 20 74 68 61 74 20  stem crash that 
7870: 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66  may follow the f
7880: 73 79 6e 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  sync() failure..
7890: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
78a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
78b0: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
78c0: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
78d0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
78e0: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
78f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
7900: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
7910: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
7920: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
7930: 6e 67 20 66 69 6c 65 73 20 61 6e 64 20 64 65 6c  ng files and del
7940: 65 74 69 6e 67 0a 20 20 20 20 2a 2a 20 6a 6f 75  eting.    ** jou
7950: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
7960: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
7970: 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
7980: 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 0a  pening we don't.
7990: 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20 63 61      ** really ca
79a0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
79b0: 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  y of the transac
79c0: 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
79d0: 67 75 61 72 61 6e 74 65 65 64 2c 0a 20 20 20 20  guaranteed,.    
79e0: 2a 2a 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  ** but some stra
79f0: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
7a00: 73 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  s may be lying a
7a10: 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
7a20: 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72   an.    ** error
7a30: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
7a40: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
7a50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7a60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
7a70: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
7a80: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7a90: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
7aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7ab0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
7ac0: 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
7ad0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
7ae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7af0: 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72 79 20  *.** Find every 
7b00: 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65 72 20  active VM other 
7b10: 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64 20 63  than pVdbe and c
7b20: 68 61 6e 67 65 20 69 74 73 20 73 74 61 74 75 73  hange its status
7b30: 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64 2e 20   to.** aborted. 
7b40: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
7b50: 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73 65 73  en one VM causes
7b60: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75 65 20   a rollback due 
7b70: 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46  to an.** ON CONF
7b80: 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20 63 6c  LICT ROLLBACK cl
7b90: 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d 70 6c  ause (for exampl
7ba0: 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72 20 56  e).  The other V
7bb0: 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61 62  Ms must be.** ab
7bc0: 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  orted so that th
7bd0: 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 64  ey do not have d
7be0: 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74 20 66  ata rolled out f
7bf0: 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68 0a 2a  rom underneath.*
7c00: 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67 20 74  * them leading t
7c10: 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2f  o a segfault..*/
7c20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62 6f  .static void abo
7c30: 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62  rtOtherActiveVdb
7c40: 65 73 28 56 64 62 65 20 2a 70 56 64 62 65 29 7b  es(Vdbe *pVdbe){
7c50: 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72 3b  .  Vdbe *pOther;
7c60: 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 70 56  .  for(pOther=pV
7c70: 64 62 65 2d 3e 64 62 2d 3e 70 56 64 62 65 3b 20  dbe->db->pVdbe; 
7c80: 70 4f 74 68 65 72 3b 20 70 4f 74 68 65 72 3d 70  pOther; pOther=p
7c90: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Other->pNext){. 
7ca0: 20 20 20 69 66 28 20 70 4f 74 68 65 72 3d 3d 70     if( pOther==p
7cb0: 56 64 62 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Vdbe ) continue;
7cc0: 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 2d  .    if( pOther-
7cd0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
7ce0: 49 43 5f 52 55 4e 20 7c 7c 20 70 4f 74 68 65 72  IC_RUN || pOther
7cf0: 2d 3e 70 63 3c 30 20 29 20 63 6f 6e 74 69 6e 75  ->pc<0 ) continu
7d00: 65 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43  e;.    closeAllC
7d10: 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29 3b 0a  ursors(pOther);.
7d20: 20 20 20 20 70 4f 74 68 65 72 2d 3e 61 62 6f 72      pOther->abor
7d30: 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ted = 1;.  }.}..
7d40: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
7d50: 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
7d60: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69  the sqlite3.acti
7d70: 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20  veVdbeCnt count 
7d80: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
7d90: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
7da0: 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
7db0: 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
7dc0: 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
7dd0: 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
7de0: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
7df0: 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
7e00: 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
7e10: 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
7e20: 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
7e30: 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
7e40: 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
7e50: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
7e60: 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
7e70: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
7e80: 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
7e90: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
7ea0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
7eb0: 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
7ec0: 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
7ed0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
7ee0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 70  int cnt = 0;.  p
7ef0: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
7f00: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
7f10: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
7f20: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20  BE_MAGIC_RUN && 
7f30: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
7f40: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
7f50: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
7f60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
7f70: 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64  nt==db->activeVd
7f80: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65  beCnt );.}.#else
7f90: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
7fa0: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
7fb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
7fc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7fd0: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
7fe0: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
7ff0: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
8000: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
8010: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
8020: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
8030: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
8040: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
8050: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
8060: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
8070: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
8080: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8090: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
80a0: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
80b0: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
80c0: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
80d0: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
80e0: 49 43 5f 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52  IC_HALT..**.** R
80f0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
8100: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
8110: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
8120: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
8130: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
8140: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
8150: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
8160: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
8170: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
8180: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
8190: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
81a0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
81b0: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
81c0: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
81d0: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
81e0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
81f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78  int i;.  int (*x
8200: 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74  Func)(Btree *pBt
8210: 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74  ) = 0;  /* Funct
8220: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65  ion to call on e
8230: 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e  ach btree backen
8240: 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d  d */..  if( p->m
8250: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
8260: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41  _RUN ){.    /* A
8270: 6c 72 65 61 64 79 20 68 61 6c 74 65 64 2e 20 20  lready halted.  
8280: 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 2a  Nothing to do. *
8290: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
82a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
82b0: 49 43 5f 48 41 4c 54 20 29 3b 0a 20 20 20 20 72  IC_HALT );.    r
82c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
82d0: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  .  }.  closeAllC
82e0: 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65  ursors(p);.  che
82f0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
8300: 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  db);.  if( p->pc
8310: 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  <0 ){.    /* No 
8320: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
8330: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
8340: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
8350: 74 61 72 74 65 64 20 2a 2f 0a 20 20 7d 65 6c 73  tarted */.  }els
8360: 65 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f  e if( db->autoCo
8370: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69  mmit && db->acti
8380: 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a  veVdbeCnt==1 ){.
8390: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
83a0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
83b0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
83c0: 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ail ){.      /* 
83d0: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
83e0: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
83f0: 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72  ere are no other
8400: 20 61 63 74 69 76 65 20 71 75 65 72 69 65 73 0a   active queries.
8410: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74        ** using t
8420: 68 69 73 20 68 61 6e 64 6c 65 20 61 6e 64 20 74  his handle and t
8430: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
8440: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 6f  was successful o
8450: 72 20 68 69 74 20 61 6e 0a 20 20 20 20 20 20 2a  r hit an.      *
8460: 2a 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  * 'OR FAIL' cons
8470: 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61  traint. This mea
8480: 6e 73 20 61 20 63 6f 6d 6d 69 74 20 69 73 20 72  ns a commit is r
8490: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a  equired..      *
84a0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  /.      int rc =
84b0: 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b   vdbeCommit(db);
84c0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
84d0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
84e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
84f0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
8500: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
8510: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8520: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
8530: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
8540: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
8550: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
8560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 46   }else{.      xF
8570: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
8580: 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  eeRollback;.    
8590: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
85a0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
85b0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
85c0: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
85d0: 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20  {.      xFunc = 
85e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
85f0: 69 74 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73  itStmt;.    }els
8600: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
8610: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
8620: 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20  {.      xFunc = 
8630: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
8640: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 7d 65  backStmt;.    }e
8650: 6c 73 65 7b 0a 20 20 20 20 20 20 78 46 75 6e 63  lse{.      xFunc
8660: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
8670: 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 64  ollback;.      d
8680: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
8690: 31 3b 0a 20 20 20 20 20 20 61 62 6f 72 74 4f 74  1;.      abortOt
86a0: 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28 70  herActiveVdbes(p
86b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
86c0: 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e  /* If xFunc is n
86d0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
86e0: 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74   is one of sqlit
86f0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 2c  e3BtreeRollback,
8700: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  .  ** sqlite3Btr
8710: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f  eeRollbackStmt o
8720: 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  r sqlite3BtreeCo
8730: 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69  mmitStmt. Call i
8740: 74 20 6f 6e 63 65 20 6f 6e 0a 20 20 2a 2a 20 65  t once on.  ** e
8750: 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20  ach backend. If 
8760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8770: 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
8780: 6f 64 65 20 69 73 20 73 74 69 6c 6c 0a 20 20 2a  ode is still.  *
8790: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  * SQLITE_OK, set
87a0: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
87b0: 20 74 6f 20 74 68 65 20 6e 65 77 20 65 72 72 6f   to the new erro
87c0: 72 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  r value..  */.  
87d0: 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20 26  for(i=0; xFunc &
87e0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
87f0: 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ){ .    int rc;.
8800: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8810: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8820: 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
8830: 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63        rc = xFunc
8840: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
8850: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
8860: 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  K ) p->rc = rc;.
8870: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8880: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
8890: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
88a0: 20 44 45 4c 45 54 45 2c 20 73 65 74 20 74 68 65   DELETE, set the
88b0: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
88c0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 63 68 61   */.  if( p->cha
88d0: 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70  ngeCntOn && p->p
88e0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
88f0: 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d  !xFunc || xFunc=
8900: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d  =sqlite3BtreeCom
8910: 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  mitStmt ){.     
8920: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8930: 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
8940: 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 65 6c 73  hange);.    }els
8950: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8960: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
8970: 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, 0);.    }.   
8980: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
8990: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
89a0: 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e  ack or commit an
89b0: 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  y schema changes
89c0: 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20   that occurred. 
89d0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  */.  if( p->rc!=
89e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
89f0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
8a00: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
8a10: 64 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  db);.  }else if(
8a20: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
8a30: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
8a40: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
8a50: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
8a60: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 0a  anges(db);.  }..
8a70: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
8a80: 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
8a90: 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
8aa0: 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
8ab0: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
8ac0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
8ad0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
8ae0: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  t--;.  }.  p->ma
8af0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
8b00: 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
8b10: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
8b20: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
8b30: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
8b40: 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
8b50: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
8b60: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
8b70: 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
8b80: 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
8b90: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
8ba0: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
8bb0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
8bc0: 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
8bd0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
8be0: 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
8bf0: 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
8c00: 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
8c10: 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
8c20: 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
8c30: 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
8c40: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
8c50: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
8c60: 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
8c70: 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
8c80: 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
8c90: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
8ca0: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
8cb0: 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
8cc0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
8cd0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
8ce0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
8cf0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 6d  AGIC_RUN && p->m
8d00: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
8d10: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 73 71 6c  _HALT ){.    sql
8d20: 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c  ite3Error(p->db,
8d30: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
8d40: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0);.    return S
8d50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
8d60: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  }..  /* If the V
8d70: 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
8d80: 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
8d90: 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
8da0: 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
8db0: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
8dc0: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
8dd0: 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
8de0: 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
8df0: 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
8e00: 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
8e10: 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
8e20: 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
8e30: 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
8e40: 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
8e50: 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
8e60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
8e70: 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
8e80: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
8e90: 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
8ea0: 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
8eb0: 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
8ec0: 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
8ed0: 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
8ee0: 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
8ef0: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
8f00: 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
8f10: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
8f20: 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
8f30: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
8f40: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
8f50: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45  ){.    if( p->zE
8f60: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
8f70: 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64  qlite3Error(p->d
8f80: 62 2c 20 70 2d 3e 72 63 2c 20 22 25 73 22 2c 20  b, p->rc, "%s", 
8f90: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
8fa0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
8fb0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
8fc0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
8fd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8fe0: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
8ff0: 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62  lite3Error(p->db
9000: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
9010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9020: 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62  lite3Error(p->db
9030: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
9040: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
9050: 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
9060: 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
9070: 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
9080: 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
9090: 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
90a0: 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
90b0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
90c0: 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
90d0: 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
90e0: 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
90f0: 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
9100: 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
9110: 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
9120: 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
9130: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
9140: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
9150: 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c, 0);.  }..  /*
9160: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
9170: 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
9180: 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
9190: 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
91a0: 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
91b0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
91c0: 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
91d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
91e0: 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70  Tos<&p->aStack[p
91f0: 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20  ->pc<0?0:p->pc] 
9200: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
9210: 63 5f 66 61 69 6c 65 64 3d 3d 31 20 29 3b 0a 23  c_failed==1 );.#
9220: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
9230: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
9240: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
9250: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
9260: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
9270: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
9280: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
9290: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
92a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
92b0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
92c0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
92d0: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
92e0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
92f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
9300: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
9310: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9320: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
9330: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
9340: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
9350: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
9360: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
9370: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
9380: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
9390: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
93a0: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
93b0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
93c0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
93d0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
93e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
93f0: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
9400: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
9410: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
9420: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
9430: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
9440: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
9450: 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74  INIT;.  p->abort
9460: 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  ed = 0;.  if( p-
9470: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45  >rc==SQLITE_SCHE
9480: 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MA ){.    sqlite
9490: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
94a0: 68 65 6d 61 28 70 2d 3e 64 62 2c 20 30 29 3b 0a  hema(p->db, 0);.
94b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
94c0: 72 63 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  rc;.}. ./*.** Cl
94d0: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
94e0: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
94f0: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
9500: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
9510: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
9520: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
9530: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
9540: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
9550: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
9560: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
9570: 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
9580: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9590: 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  K;..  if( p->mag
95a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
95b0: 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
95c0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
95d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
95e0: 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
95f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
9600: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
9610: 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65  C_INIT ){.    re
9620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
9630: 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  SE;.  }.  sqlite
9640: 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
9650: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9660: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
9670: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
9680: 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
9690: 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
96a0: 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
96b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
96c0: 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
96d0: 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
96e0: 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
96f0: 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
9700: 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
9710: 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
9720: 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
9730: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
9740: 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
9750: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
9760: 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
9770: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
9780: 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
9790: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
97a0: 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
97b0: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
97c0: 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
97d0: 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
97e0: 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
97f0: 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
9800: 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41  k&(1<<i))) && pA
9810: 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20  ux->pAux ){.    
9820: 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
9830: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
9840: 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
9850: 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
9860: 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41  }.      pAux->pA
9870: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
9880: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
9890: 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
98a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
98b0: 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
98c0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
98d0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
98e0: 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29  rn;.  Cleanup(p)
98f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
9900: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
9910: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
9920: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
9930: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9940: 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
9950: 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70  p->db->pVdbe = p
9960: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
9970: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
9980: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
9990: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
99a0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20   }.  if( p->aOp 
99b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
99c0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
99d0: 20 20 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20        Op *pOp = 
99e0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
99f0: 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33    freeP3(pOp->p3
9a00: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a  type, pOp->p3);.
9a10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9a20: 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  Free(p->aOp);.  
9a30: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
9a40: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
9a50: 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  nVar);.  sqliteF
9a60: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
9a70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
9a80: 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61  aStack);.  relea
9a90: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
9aa0: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
9ab0: 6f 6c 75 6d 6e 2a 32 29 3b 0a 20 20 73 71 6c 69  olumn*2);.  sqli
9ac0: 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61  teFree(p->aColNa
9ad0: 6d 65 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  me);.  p->magic 
9ae0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
9af0: 44 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  D;.  sqliteFree(
9b00: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  p);.}../*.** If 
9b10: 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
9b20: 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
9b30: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
9b40: 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
9b50: 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
9b60: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
9b70: 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76  code.  If no Mov
9b80: 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  eTo is pending, 
9b90: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
9ba0: 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64  does nothing and
9bb0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
9bc0: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
9bd0: 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
9be0: 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  to(Cursor *p){. 
9bf0: 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
9c00: 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
9c10: 74 20 72 65 73 2c 20 72 63 3b 0a 20 20 20 20 65  t res, rc;.    e
9c20: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
9c30: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
9c40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
9c50: 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 69 66  sTable );.    if
9c60: 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a  ( p->isTable ){.
9c70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9c80: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
9c90: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
9ca0: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 26 72  movetoTarget, &r
9cb0: 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
9cc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9cd0: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
9ce0: 3e 70 43 75 72 73 6f 72 2c 28 63 68 61 72 2a 29  >pCursor,(char*)
9cf0: 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  &p->movetoTarget
9d00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 73 69 7a 65 6f 66 28 69 36 34 29 2c 26 72 65 73  sizeof(i64),&res
9d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9d40: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9d50: 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65  .    *p->pIncrKe
9d60: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61  y = 0;.    p->la
9d70: 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49  stRowid = keyToI
9d80: 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  nt(p->movetoTarg
9d90: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  et);.    p->rowi
9da0: 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  dIsValid = res==
9db0: 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  0;.    if( res<0
9dc0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9dd0: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
9de0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  p->pCursor, &res
9df0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
9e00: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
9e10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
9e20: 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  earch_count++;. 
9e30: 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
9e40: 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
9e50: 3e 63 61 63 68 65 56 61 6c 69 64 20 3d 20 30 3b  >cacheValid = 0;
9e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9e70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9e80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9e90: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
9ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
9eb0: 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
9ec0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
9ed0: 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
9ee0: 33 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28  3VdbeSerialRead(
9ef0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
9f00: 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
9f10: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
9f20: 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  Write().**.** en
9f30: 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
9f40: 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
9f50: 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
9f60: 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
9f70: 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
9f80: 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
9f90: 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
9fa0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
9fb0: 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
9fc0: 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
9fd0: 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
9fe0: 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
9ff0: 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
a000: 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
a010: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
a020: 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
a030: 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
a040: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
a050: 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
a060: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
a070: 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
a080: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
a090: 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
a0a0: 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
a0b0: 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
a0c0: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
a0d0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
a0e0: 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
a0f0: 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
a100: 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
a110: 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
a120: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
a130: 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
a140: 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
a150: 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
a160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
a170: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
a180: 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
a190: 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
a1a0: 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
a1b0: 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
a1c0: 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
a1d0: 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
a1e0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
a1f0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
a200: 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
a210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
a220: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
a230: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
a240: 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
a250: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
a260: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
a270: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
a280: 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
a2b0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
a2c0: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
a2e0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
a2f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
a300: 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
a310: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
a320: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
a330: 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
a360: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
a370: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
a380: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
a390: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
a3a0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
a3d0: 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
a3e0: 20 20 20 38 2d 31 31 20 20 20 20 20 20 20 20 20     8-11         
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
a410: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
a420: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
a430: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
a440: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
a450: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
a460: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
a470: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
a480: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
a490: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
a4a0: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
a4b0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
a4c0: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
a4d0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
a4e0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66   *pMem){.  int f
a4f0: 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
a500: 67 73 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73  gs;..  if( flags
a510: 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
a520: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a530: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
a540: 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
a550: 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
a560: 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
a570: 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
a580: 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
a590: 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
a5a0: 30 30 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31  00001000)<<32)-1
a5b0: 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
a5c0: 65 6d 2d 3e 69 3b 0a 20 20 20 20 75 36 34 20 75  em->i;.    u64 u
a5d0: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
a5e0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
a5f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
a600: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
a610: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
a620: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
a630: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
a640: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
a650: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
a660: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
a670: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
a680: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
a690: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
a6a0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
a6b0: 37 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  7;.  }.  if( fla
a6c0: 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
a6d0: 20 20 69 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e    int n = pMem->
a6e0: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  n;.    assert( n
a6f0: 3e 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  >=0 );.    retur
a700: 6e 20 28 28 6e 2a 32 29 20 2b 20 31 33 29 3b 0a  n ((n*2) + 13);.
a710: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
a720: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
a730: 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a  return (pMem->n*
a740: 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72  2 + 12);.  }.  r
a750: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
a760: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
a770: 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
a780: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
a790: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
a7a0: 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e  rial-type..*/.in
a7b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
a7c0: 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
a7d0: 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
a7e0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
a7f0: 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
a800: 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
a810: 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
a820: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
a830: 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
a840: 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
a850: 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
a860: 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
a870: 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
a880: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
a890: 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
a8a0: 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
a8b0: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
a8c0: 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
a8d0: 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
a8e0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
a8f0: 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
a900: 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
a910: 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
a920: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
a930: 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
a940: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
a950: 62 65 53 65 72 69 61 6c 50 75 74 28 75 6e 73 69  beSerialPut(unsi
a960: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
a970: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 75 33  Mem *pMem){.  u3
a980: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
a990: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
a9a0: 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a 20 20 69  lType(pMem);.  i
a9b0: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 4e 55  nt len;..  /* NU
a9c0: 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  LL */.  if( seri
a9d0: 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
a9e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a9f0: 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61   .  /* Integer a
aa00: 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
aa10: 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
aa20: 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
aa30: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
aa40: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
aa50: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75  ){.      v = *(u
aa60: 36 34 2a 29 26 70 4d 65 6d 2d 3e 72 3b 0a 20 20  64*)&pMem->r;.  
aa70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
aa80: 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d   = *(u64*)&pMem-
aa90: 3e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  >i;.    }.    le
aaa0: 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
aab0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
aac0: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
aad0: 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
aae0: 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
aaf0: 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
ab00: 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20  v >>= 8;.    }. 
ab10: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
ab20: 20 7d 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e   }.  .  /* Strin
ab30: 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61  g or blob */.  a
ab40: 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
ab50: 70 65 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20  pe>=12 );.  len 
ab60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
ab70: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
ab80: 6c 5f 74 79 70 65 29 3b 0a 20 20 6d 65 6d 63 70  l_type);.  memcp
ab90: 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
aba0: 6c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c  len);.  return l
abb0: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  en;.}../*.** Des
abc0: 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
abd0: 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
abe0: 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
abf0: 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
ac00: 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
ac10: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
ac20: 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
ac30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
ac40: 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73   read..*/ .int s
ac50: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ac60: 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
ac70: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
ac80: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
ac90: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
aca0: 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
acb0: 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
acc0: 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
acd0: 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
ace0: 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
acf0: 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
ad00: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
ad10: 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
ad20: 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
ad30: 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
ad40: 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
ad50: 65 20 38 3a 20 20 20 20 2f 2a 20 52 65 73 65 72  e 8:    /* Reser
ad60: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
ad70: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39  se */.    case 9
ad80: 3a 20 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  :    /* Reserved
ad90: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
ada0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  */.    case 10: 
adb0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
adc0: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
add0: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
ade0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
adf0: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
ae00: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
ae10: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
ae20: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
ae30: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
ae40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ae50: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
ae60: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
ae70: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20  /.      pMem->i 
ae80: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
ae90: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
aea0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
aeb0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
aec0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
aed0: 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
aee0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
aef0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
af00: 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
af10: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
af20: 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
af30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
af40: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
af50: 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
af60: 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
af70: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
af80: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
af90: 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  ->i = (((signed 
afa0: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
afb0: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
afc0: 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
afd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
afe0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
aff0: 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
b000: 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
b010: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
b020: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
b030: 6d 2d 3e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c  m->i = (buf[0]<<
b040: 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
b050: 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
b060: 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
b070: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
b080: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
b090: 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
b0a0: 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
b0b0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
b0c0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36  eger */.      u6
b0d0: 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20  4 x = (((signed 
b0e0: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
b0f0: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
b100: 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d   u32 y = (buf[2]
b110: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c  <<24) | (buf[3]<
b120: 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c  <16) | (buf[4]<<
b130: 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20  8) | buf[5];.   
b140: 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
b150: 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   y;.      pMem->
b160: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
b170: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
b180: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
b190: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
b1a0: 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
b1b0: 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
b1c0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
b1d0: 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
b1e0: 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
b1f0: 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b   */.      u64 x;
b200: 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69  .      u32 y;.#i
b210: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
b220: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
b230: 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
b240: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
b250: 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
b260: 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
b270: 6f 72 64 65 72 2e 20 20 54 68 65 20 62 79 74 65  order.  The byte
b280: 20 6f 72 64 65 72 20 64 69 66 66 65 72 73 20 6f   order differs o
b290: 6e 20 73 6f 6d 65 20 28 62 72 6f 6b 65 6e 29 20  n some (broken) 
b2a0: 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 0a 20  architectures.. 
b2b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
b2c0: 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
b2d0: 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
b2e0: 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
b2f0: 20 61 73 73 65 72 74 28 20 31 2e 30 3d 3d 2a 28   assert( 1.0==*(
b300: 64 6f 75 62 6c 65 2a 29 26 74 31 20 29 3b 0a 23  double*)&t1 );.#
b310: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
b320: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
b330: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
b340: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
b350: 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
b360: 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
b370: 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
b380: 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
b390: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
b3a0: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
b3b0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
b3c0: 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
b3d0: 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26  em->i = *(i64*)&
b3e0: 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
b3f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b400: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b410: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d         pMem->r =
b420: 20 2a 28 64 6f 75 62 6c 65 2a 29 26 78 3b 0a 20   *(double*)&x;. 
b430: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
b440: 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  gs = MEM_Real;. 
b450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
b460: 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
b470: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b480: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72    int len = (ser
b490: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
b4a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
b4b0: 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
b4c0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
b4d0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
b4e0: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
b4f0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
b500: 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
b510: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b520: 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
b530: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b540: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b550: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
b560: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
b570: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
b580: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
b590: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b5a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b5b0: 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
b5c0: 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
b5d0: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 73 70  index records sp
b5e0: 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b  ecified by .** {
b5f0: 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
b600: 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d  d {nKey2, pKey2}
b610: 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65  , returning a ne
b620: 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
b630: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
b640: 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70  ger if {nKey1, p
b650: 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68  Key1} is less th
b660: 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
b670: 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
b680: 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e   {nKey2, pKey2}.
b690: 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20    Both Key1 and 
b6a0: 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62 79 74  Key2 must be byt
b6b0: 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d  e strings.** com
b6c0: 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f  posed by the OP_
b6d0: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
b6e0: 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a  e of the VDBE..*
b6f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
b700: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
b710: 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61    void *userData
b720: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
b730: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
b740: 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  , .  int nKey2, 
b750: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
b760: 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  2.){.  KeyInfo *
b770: 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49  pKeyInfo = (KeyI
b780: 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20  nfo*)userData;. 
b790: 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20   u32 d1, d2;    
b7a0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b7b0: 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
b7c0: 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
b7d0: 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20   */.  u32 idx1, 
b7e0: 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66  idx2;      /* Of
b7f0: 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
b800: 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
b810: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
b820: 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b   szHdr1, szHdr2;
b830: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
b840: 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
b850: 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
b860: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
b870: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
b880: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
b890: 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
b8a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b8b0: 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20  )pKey1;.  const 
b8c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
b8d0: 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key2 = (const un
b8e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
b8f0: 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31  ey2;..  Mem mem1
b900: 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20  ;.  Mem mem2;.  
b910: 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
b920: 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32  nfo->enc;.  mem2
b930: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
b940: 3e 65 6e 63 3b 0a 20 20 0a 20 20 69 64 78 31 20  >enc;.  .  idx1 
b950: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
b960: 6e 74 33 32 28 70 4b 65 79 31 2c 20 26 73 7a 48  nt32(pKey1, &szH
b970: 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
b980: 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 73 71  dr1;.  idx2 = sq
b990: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
b9a0: 28 70 4b 65 79 32 2c 20 26 73 7a 48 64 72 32 29  (pKey2, &szHdr2)
b9b0: 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72 32 3b  ;.  d2 = szHdr2;
b9c0: 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
b9d0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
b9e0: 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
b9f0: 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48 64 72  r1 && idx2<szHdr
ba00: 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  2 ){.    u32 ser
ba10: 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75  ial_type1;.    u
ba20: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b  32 serial_type2;
ba30: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
ba40: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
ba50: 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
ba60: 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
ba70: 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
ba80: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
ba90: 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
baa0: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3b   &serial_type1);
bab0: 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
bac0: 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
bad0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
bae0: 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
baf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32   break;.    idx2
bb00: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
bb10: 72 69 6e 74 33 32 28 26 61 4b 65 79 32 5b 69 64  rint32(&aKey2[id
bb20: 78 32 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70  x2], &serial_typ
bb30: 65 32 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e  e2);.    if( d2>
bb40: 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65  =nKey2 && sqlite
bb50: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
bb60: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29  en(serial_type2)
bb70: 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
bb80: 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
bb90: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
bba0: 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 65 61  space left in ea
bbb0: 63 68 20 6b 65 79 20 66 6f 72 20 74 68 65 20 62  ch key for the b
bbc0: 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64 61  lob of.    ** da
bbd0: 74 61 20 74 6f 20 67 6f 20 77 69 74 68 20 74 68  ta to go with th
bbe0: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6a 75  e serial type ju
bbf0: 73 74 20 72 65 61 64 2e 20 54 68 69 73 20 61 73  st read. This as
bc00: 73 65 72 74 20 6d 61 79 20 66 61 69 6c 20 69 66  sert may fail if
bc10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
bc20: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 20   is corrupted.  
bc30: 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 76 61  Then read the va
bc40: 6c 75 65 20 66 72 6f 6d 20 65 61 63 68 20 6b 65  lue from each ke
bc50: 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20 20  y into mem1.    
bc60: 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65 73 70  ** and mem2 resp
bc70: 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f  ectively..    */
bc80: 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
bc90: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
bca0: 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
bcb0: 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
bcc0: 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69  ;.    d2 += sqli
bcd0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
bce0: 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72  (&aKey2[d2], ser
bcf0: 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32  ial_type2, &mem2
bd00: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  );..    rc = sql
bd10: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
bd20: 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e  mem1, &mem2, i<n
bd30: 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f  Field ? pKeyInfo
bd40: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b  ->aColl[i] : 0);
bd50: 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c  .    if( mem1.fl
bd60: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20  ags & MEM_Dyn ) 
bd70: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
bd80: 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20  lease(&mem1);.  
bd90: 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73    if( mem2.flags
bda0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c   & MEM_Dyn ) sql
bdb0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
bdc0: 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69  se(&mem2);.    i
bdd0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
bde0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bdf0: 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
be00: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  * One of the key
be10: 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
be20: 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  lds, but all the
be30: 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
be40: 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65  at point.  ** we
be50: 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
be60: 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73   incrKey flag is
be70: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
be80: 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20  second key is.  
be90: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61  ** treated as la
bea0: 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rger..  */.  if(
beb0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
bec0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72  ( pKeyInfo->incr
bed0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
bee0: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
bef0: 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a  if( d1<nKey1 ){.
bf00: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
bf10: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c 6e    }else if( d2<n
bf20: 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20 72 63  Key2 ){.      rc
bf30: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
bf40: 0a 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ..  if( pKeyInfo
bf50: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
bf60: 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  i<pKeyInfo->nFie
bf70: 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld && pKeyInfo->
bf80: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
bf90: 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
bfa0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
bfb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
bfc0: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64  gument is an ind
bfd0: 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65  ex entry compose
bfe0: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
bff0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
c000: 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e  ..** The last en
c010: 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f  try in this reco
c020: 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  rd should be an 
c030: 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69  integer (specifi
c040: 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  cally.** an inte
c050: 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69  ger rowid).  Thi
c060: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
c070: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c080: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74  bytes in.** that
c090: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74   integer..*/.int
c0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
c0b0: 6f 77 69 64 4c 65 6e 28 69 6e 74 20 6e 4b 65 79  owidLen(int nKey
c0c0: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
c0d0: 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  ){.  u32 szHdr; 
c0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c0f0: 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
c100: 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
c110: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
c120: 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
c130: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 74  */..  sqlite3Get
c140: 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 26  Varint32(aKey, &
c150: 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74 65  szHdr);.  sqlite
c160: 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b  3GetVarint32(&aK
c170: 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79  ey[szHdr-1], &ty
c180: 70 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75  peRowid);.  retu
c190: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  rn sqlite3VdbeSe
c1a0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
c1b0: 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a  Rowid);.}.  ../*
c1c0: 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
c1d0: 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
c1e0: 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
c1f0: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
c200: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
c210: 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
c220: 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
c230: 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
c240: 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
c250: 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
c260: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
c270: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
c280: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
c290: 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
c2a0: 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
c2b0: 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
c2c0: 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
c2d0: 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
c2e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
c2f0: 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
c300: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
c310: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
c320: 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
c330: 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
c340: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
c350: 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
c360: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
c370: 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
c380: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
c390: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
c3a0: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
c3b0: 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
c3c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c3d0: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  E_CORRUPT;.  }. 
c3e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
c3f0: 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
c400: 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
c410: 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
c420: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
c430: 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rc;.  }.  sqlite
c440: 33 47 65 74 56 61 72 69 6e 74 33 32 28 6d 2e 7a  3GetVarint32(m.z
c450: 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c  , &szHdr);.  sql
c460: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
c470: 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26  &m.z[szHdr-1], &
c480: 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65  typeRowid);.  le
c490: 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
c4a0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
c4b0: 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  n(typeRowid);.  
c4c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c4d0: 6c 47 65 74 28 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  lGet(&m.z[m.n-le
c4e0: 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
c4f0: 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
c500: 64 20 3d 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74  d = v.i;.  sqlit
c510: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
c520: 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
c530: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c540: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
c550: 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
c560: 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
c570: 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f  r pC is point to
c580: 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
c590: 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b  key string in pK
c5a0: 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b  ey (of length nK
c5b0: 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ey).  Write into
c5c0: 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
c5d0: 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
c5e0: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
c5f0: 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
c600: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
c610: 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
c620: 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52  er than pKey.  R
c630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c640: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
c650: 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72  * pKey is either
c660: 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
c670: 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
c680: 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
c690: 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
c6a0: 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
c6b0: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
c6c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c6d0: 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
c6e0: 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
c6f0: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
c700: 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
c710: 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43  re(.  Cursor *pC
c720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c730: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
c740: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
c750: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  st */.  int nKey
c760: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79  , const u8 *pKey
c770: 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74  ,   /* The key t
c780: 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
c790: 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
c7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
c7b0: 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
c7c0: 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
c7d0: 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
c7e0: 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Key;.  int rc;. 
c7f0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
c800: 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
c810: 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20   int lenRowid;. 
c820: 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74   Mem m;..  sqlit
c830: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
c840: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
c850: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
c860: 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  =0 ){.    *res =
c870: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
c880: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
c890: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
c8a0: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
c8b0: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65  >pCursor, 0, nCe
c8c0: 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
c8d0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
c8e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
c8f0: 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
c900: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
c910: 6e 28 6d 2e 6e 2c 20 6d 2e 7a 29 3b 0a 20 20 2a  n(m.n, m.z);.  *
c920: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
c930: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70  eRecordCompare(p
c940: 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e  C->pKeyInfo, m.n
c950: 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20  -lenRowid, m.z, 
c960: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73  nKey, pKey);.  s
c970: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
c980: 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
c990: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c9a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c9b0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
c9c0: 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
c9d0: 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
c9e0: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
c9f0: 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
ca00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
ca10: 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
ca20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
ca30: 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
ca40: 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
ca50: 67 65 29 7b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ge){.  db->nChan
ca60: 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
ca70: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
ca80: 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
ca90: 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
caa0: 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
cab0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
cac0: 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
cad0: 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
cae0: 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
caf0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
cb00: 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
cb10: 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
cb20: 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
cb30: 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
cb40: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
cb50: 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
cb60: 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
cb70: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
cb80: 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
cb90: 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
cba0: 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
cbb0: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
cbc0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
cbd0: 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
cbe0: 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
cbf0: 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
cc00: 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
cc10: 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
cc20: 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
cc30: 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
cc40: 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
cc50: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
cc60: 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
cc70: 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
cc80: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
cc90: 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
cca0: 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
ccb0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ccc0: 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
ccd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cce0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
ccf0: 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
cd00: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
cd10: 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
cd20: 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
cd30: 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
cd40: 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
cd50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
cd60: 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
cd70: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
cd80: 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
cd90: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
cda0: 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
cdb0: 20 76 2d 3e 64 62 3b 0a 7d 0a                     v->db;.}.