/ Hex Artifact Content
Login

Artifact eb5f7185a4a714b352c0b6dc804ad3180e03ec06:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03d0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03e0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
0400: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0410: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0420: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0430: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0440: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0450: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0470: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
0480: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
0490: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04b0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04c0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
04d0: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
04e0: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
04f0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0500: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0510: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0520: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0530: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn p;.}../*.** T
0540: 75 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  urn tracing on o
0550: 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71  r off.*/.void sq
0560: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 56  lite3VdbeTrace(V
0570: 64 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72  dbe *p, FILE *tr
0580: 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65  ace){.  p->trace
0590: 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a   = trace;.}../*.
05a0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
05b0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
05c0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
05d0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
05e0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
05f0: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0600: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0610: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0620: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0630: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0640: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 20 0a  tain exactly N .
0650: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** elements..*/.
0660: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 69  static void resi
0670: 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  zeOpArray(Vdbe *
0680: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  p, int N){.  int
0690: 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d 61   runMode = p->ma
06a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
06b0: 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d 6f  RUN;.  if( runMo
06c0: 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  de || p->nOpAllo
06d0: 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  c<N ){.    VdbeO
06e0: 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  p *pNew;.    int
06f0: 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30 2a   nNew = N + 100*
0700: 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  (!runMode);.    
0710: 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d  int oldSize = p-
0720: 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  >nOpAlloc;.    p
0730: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0740: 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77  loc(p->aOp, nNew
0750: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0760: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0770: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0780: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d  = nNew;.      p-
0790: 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20  >aOp = pNew;.   
07a0: 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f 6c 64 53     if( nNew>oldS
07b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ize ){.        m
07c0: 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c  emset(&p->aOp[ol
07d0: 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e 4e 65 77  dSize], 0, (nNew
07e0: 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66  -oldSize)*sizeof
07f0: 28 4f 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (Op));.      }. 
0800: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0810: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0820: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0830: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0840: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0850: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0860: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0870: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0880: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0890: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
08a0: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
08b0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
08c0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
08d0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
08e0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
08f0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0900: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 20  **.**    p1, p2 
0910: 20 20 20 20 20 20 20 20 20 46 69 72 73 74 20 74           First t
0920: 77 6f 20 6f 66 20 74 68 65 20 74 68 72 65 65 20  wo of the three 
0930: 70 6f 73 73 69 62 6c 65 20 6f 70 65 72 61 6e 64  possible operand
0940: 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  s..**.** Use the
0950: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
0960: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
0970: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
0980: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
0990: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
09a0: 67 65 50 33 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP3() function 
09b0: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
09c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a  lue of the P3.**
09d0: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
09e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
09f0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  p(Vdbe *p, int o
0a00: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0a10: 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  2){.  int i;.  V
0a20: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69  dbeOp *pOp;..  i
0a30: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
0a40: 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  nOp++;.  assert(
0a50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0a60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0a70: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
0a80: 20 69 2b 31 29 3b 0a 20 20 69 66 28 20 73 71 6c   i+1);.  if( sql
0a90: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
0aa0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
0ab0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   0;.  }.  pOp = 
0ac0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0ad0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a  p->opcode = op;.
0ae0: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a    pOp->p1 = p1;.
0af0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a    pOp->p2 = p2;.
0b00: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
0b10: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
0b20: 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e  3_NOTUSED;.  p->
0b30: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66  expired = 0;.#if
0b40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0b50: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
0b60: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
0b70: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0b80: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0b90: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  Op[i]);.#endif. 
0ba0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
0bb0: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
0bc0: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
0bd0: 74 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f  the p3 value..*/
0be0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0bf0: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
0c00: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
0c10: 20 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   p2, const char 
0c20: 2a 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29  *zP3,int p3type)
0c30: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
0c40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0c50: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a  p, op, p1, p2);.
0c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
0c70: 6e 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP3(p, addr, z
0c80: 50 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72  P3, p3type);.  r
0c90: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
0ca0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
0cb0: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
0cc0: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
0cd0: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
0ce0: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
0cf0: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
0d00: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
0d10: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
0d20: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
0d30: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
0d40: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
0d50: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
0d60: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
0d70: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
0d80: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
0d90: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
0da0: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
0db0: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
0dc0: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
0dd0: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
0de0: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
0df0: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
0e00: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
0e10: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
0e30: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
0e40: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
0e50: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
0e60: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
0e70: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
0e80: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
0e90: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
0ea0: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
0eb0: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
0ec0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
0ed0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
0ee0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  resolved..**.** 
0ef0: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
0f00: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
0f10: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
0f20: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
0f30: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
0f40: 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c  t i;.  i = p->nL
0f50: 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74  abel++;.  assert
0f60: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0f70: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0f80: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65   if( i>=p->nLabe
0f90: 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  lAlloc ){.    p-
0fa0: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70  >nLabelAlloc = p
0fb0: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20  ->nLabelAlloc*2 
0fc0: 2b 20 31 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  + 10;.    sqlite
0fd0: 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28  3ReallocOrFree((
0fe0: 76 6f 69 64 2a 2a 29 26 70 2d 3e 61 4c 61 62 65  void**)&p->aLabe
0ff0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1010: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
1020: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1030: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1040: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1050: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
1060: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1070: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1080: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1090: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
10a0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
10b0: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
10c0: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
10d0: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
10e0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
10f0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1100: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1110: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1120: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
1130: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1140: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
1150: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
1160: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
1170: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1180: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1190: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
11a0: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
11b0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
11c0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
11d0: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
11e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
11f0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1200: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1210: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
1220: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
1230: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
1240: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
1250: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
1260: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
1270: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
1280: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
1290: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
12a0: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
12b0: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
12c0: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
12d0: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
12e0: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
12f0: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1300: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1310: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
1320: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
1330: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
1340: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
1350: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
1360: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
1370: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
1380: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
1390: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
13a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
13b0: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
13c0: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
13d0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
13e0: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
13f0: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1400: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1410: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1420: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
1430: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
1440: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
1450: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
1460: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
1470: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
1480: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
1490: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
14a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
14b0: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
14c0: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
14d0: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
14e0: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
14f0: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1500: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1510: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1520: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1530: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1540: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1550: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
1560: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
1570: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
1580: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
1590: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
15a0: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
15b0: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
15c0: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
15d0: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
15e0: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
15f0: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1600: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1610: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1620: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1630: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1640: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1650: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
1660: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
1670: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
1680: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 4e 4f 50  SH_MASK_0 + (NOP
1690: 55 53 48 5f 4d 41 53 4b 5f 31 3c 3c 31 36 29 2c  USH_MASK_1<<16),
16a0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
16b0: 5f 32 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53  _2 + (NOPUSH_MAS
16c0: 4b 5f 33 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f  K_3<<16),.    NO
16d0: 50 55 53 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 4e  PUSH_MASK_4 + (N
16e0: 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 3c 3c 31 36  OPUSH_MASK_5<<16
16f0: 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41  ),.    NOPUSH_MA
1700: 53 4b 5f 36 20 2b 20 28 4e 4f 50 55 53 48 5f 4d  SK_6 + (NOPUSH_M
1710: 41 53 4b 5f 37 3c 3c 31 36 29 2c 0a 20 20 20 20  ASK_7<<16),.    
1720: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1730: 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 3c 3c  (NOPUSH_MASK_9<<
1740: 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72  16).  };.  asser
1750: 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f 70 3c 33  t( op>=0 && op<3
1760: 32 2a 35 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  2*5 );.  return 
1770: 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d 20 26 20  (masks[op>>5] & 
1780: 28 31 3c 3c 28 6f 70 26 30 78 31 46 29 29 29 3b  (1<<(op&0x1F)));
1790: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
17a0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  UG.int sqlite3Vd
17b0: 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73 68 28 75  beOpcodeNoPush(u
17c0: 38 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  8 op){.  return 
17d0: 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 29  opcodeNoPush(op)
17e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17f0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
1800: 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69  he program looki
1810: 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73  ng for P2 values
1820: 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69   that are negati
1830: 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73 75 63 68  ve..** Each such
1840: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1850: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 20  l.  Resolve the 
1860: 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67  label by setting
1870: 20 74 68 65 20 50 32 0a 2a 2a 20 76 61 6c 75 65   the P2.** value
1880: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
1890: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
18a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
18c0: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
18d0: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
18e0: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
18f0: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
1900: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
1910: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
1920: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
1930: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
1940: 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 20 4f 50 5f  _Function or OP_
1950: 41 67 67 53 74 65 70 20 6f 70 63 6f 64 65 2e 20  AggStep opcode. 
1960: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
1970: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d  .** sqlite3VdbeM
1980: 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69  akeReady() to si
1990: 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  ze the Vdbe.apAr
19a0: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  g[] array..**.**
19b0: 20 54 68 65 20 69 6e 74 65 67 65 72 20 2a 70 4d   The integer *pM
19c0: 61 78 53 74 61 63 6b 20 69 73 20 73 65 74 20 74  axStack is set t
19d0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  o the maximum nu
19e0: 6d 62 65 72 20 6f 66 20 76 64 62 65 20 73 74 61  mber of vdbe sta
19f0: 63 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  ck.** entries th
1a00: 61 74 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73  at static analys
1a10: 69 73 20 72 65 76 65 61 6c 73 20 74 68 69 73 20  is reveals this 
1a20: 70 72 6f 67 72 61 6d 20 6d 69 67 68 74 20 6e 65  program might ne
1a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1a40: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
1a50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
1a60: 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74  ptimization:  It
1a70: 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 48 61   scans for.** Ha
1a80: 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  lt instructions 
1a90: 77 68 65 72 65 20 50 31 3d 3d 53 51 4c 49 54 45  where P1==SQLITE
1aa0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6f 72 20 50  _CONSTRAINT or P
1ab0: 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f 72 20 66  2==OE_Abort or f
1ac0: 6f 72 0a 2a 2a 20 49 64 78 49 6e 73 65 72 74 20  or.** IdxInsert 
1ad0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65  instructions whe
1ae0: 72 65 20 50 32 21 3d 30 2e 20 20 49 66 20 6e 6f  re P2!=0.  If no
1af0: 20 73 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f   such instructio
1b00: 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  n is.** found, t
1b10: 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d  hen every Statem
1b20: 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ent instruction 
1b30: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20  is changed to a 
1b40: 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20 74 68 69  Noop.  In.** thi
1b50: 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20  s way, we avoid 
1b60: 63 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61  creating the sta
1b70: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1b80: 69 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c  ile unnecessaril
1b90: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1ba0: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
1bb0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
1bc0: 70 4d 61 78 46 75 6e 63 41 72 67 73 2c 20 69 6e  pMaxFuncArgs, in
1bd0: 74 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20  t *pMaxStack){. 
1be0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d   int i;.  int nM
1bf0: 61 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e  axArgs = 0;.  in
1c00: 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d  t nMaxStack = p-
1c10: 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b  >nOp;.  Op *pOp;
1c20: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
1c30: 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e   p->aLabel;.  in
1c40: 74 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52  t doesStatementR
1c50: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69  ollback = 0;.  i
1c60: 6e 74 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  nt hasStatementB
1c70: 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  egin = 0;.  for(
1c80: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d  pOp=p->aOp, i=p-
1c90: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >nOp-1; i>=0; i-
1ca0: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75  -, pOp++){.    u
1cb0: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  8 opcode = pOp->
1cc0: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28  opcode;..    if(
1cd0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
1ce0: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
1cf0: 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20  OP_AggStep ){.  
1d00: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
1d10: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1d20: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
1d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1d40: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a  ode==OP_Halt ){.
1d50: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1d60: 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  1==SQLITE_CONSTR
1d70: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
1d80: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
1d90: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
1da0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
1db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1dc0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
1dd0: 5f 49 64 78 49 6e 73 65 72 74 20 29 7b 0a 20 20  _IdxInsert ){.  
1de0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20      if( pOp->p2 
1df0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73 53  ){.        doesS
1e00: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1e10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1e20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1e30: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
1e40: 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74 61   ){.      hasSta
1e50: 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b  tementBegin = 1;
1e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1e70: 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63  opcodeNoPush(opc
1e80: 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d  ode) ){.      nM
1e90: 61 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d  axStack--;.    }
1ea0: 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ..    if( pOp->p
1eb0: 32 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  2>=0 ) continue;
1ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d  .    assert( -1-
1ed0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
1ee0: 6c 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32  l );.    pOp->p2
1ef0: 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70   = aLabel[-1-pOp
1f00: 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c  ->p2];.  }.  sql
1f10: 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65  iteFree(p->aLabe
1f20: 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20  l);.  p->aLabel 
1f30: 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e  = 0;..  *pMaxFun
1f40: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
1f50: 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d  ;.  *pMaxStack =
1f60: 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f   nMaxStack;..  /
1f70: 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f  * If we never ro
1f80: 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
1f90: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
1fa0: 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20  then statement. 
1fb0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
1fc0: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e   are not needed.
1fd0: 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72    So change ever
1fe0: 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20  y OP_Statement. 
1ff0: 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20   ** opcode into 
2000: 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69  an OP_Noop.  Thi
2010: 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74  s avoid a call t
2020: 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  o sqlite3OsOpenE
2030: 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20  xclusive().  ** 
2040: 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70  which can be exp
2050: 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70  ensive on some p
2060: 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20  latforms..  */. 
2070: 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e   if( hasStatemen
2080: 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53  tBegin && !doesS
2090: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
20a0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d   ){.    for(pOp=
20b0: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
20c0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
20d0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
20e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
20f0: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
2100: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
2110: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
2120: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2130: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2140: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2150: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2160: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2170: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2180: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2190: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
21a0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
21b0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
21c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
21d0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
21e0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
21f0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
2200: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
2210: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
2220: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
2230: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
2240: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
2250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
2260: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
2270: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
2280: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
2290: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
22a0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
22b0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
22c0: 0a 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  .  resizeOpArray
22d0: 28 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  (p, p->nOp + nOp
22e0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
22f0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
2300: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2310: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
2320: 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30  nOp;.  if( nOp>0
2330: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2340: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
2350: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
2360: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2370: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
2380: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
2390: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
23a0: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
23b0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
23c0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
23d0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
23e0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
23f0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
2400: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c 30   pOut->p2 = p2<0
2410: 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   ? addr + ADDR(p
2420: 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20 70  2) : p2;.      p
2430: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70  Out->p3 = pIn->p
2440: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  3;.      pOut->p
2450: 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70 33 20  3type = pIn->p3 
2460: 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20 50 33  ? P3_STATIC : P3
2470: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
2480: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
24a0: 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65  vdbe_addop_trace
24b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24c0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
24d0: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
24e0: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
24f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2500: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
2510: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
2520: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2530: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2540: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
2550: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2560: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2570: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2580: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
2590: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
25a0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
25b0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
25c0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
25d0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
25e0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
25f0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2600: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2610: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
2620: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2630: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2640: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2650: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
2660: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2670: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
2680: 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f  addr>=0 && p->nO
2690: 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70  p>addr && p->aOp
26a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
26b0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
26c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
26d0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
26e0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
26f0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2700: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
2710: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2720: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
2730: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
2740: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
2760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2770: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2780: 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29  assert( val>=0 )
2790: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
27a0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
27b0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
27c0: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
27d0: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
27e0: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
27f0: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
2800: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2810: 43 68 61 6e 67 65 20 74 65 68 20 50 32 20 6f 70  Change teh P2 op
2820: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
2830: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
2840: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
2850: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
2860: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2870: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
2880: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2890: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
28a0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
28b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
28c0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
28d0: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 2f 2a  , p->nOp);.}../*
28e0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 33 20  .** Delete a P3 
28f0: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
2900: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
2910: 69 64 20 66 72 65 65 50 33 28 69 6e 74 20 70 33  id freeP3(int p3
2920: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29 7b  type, void *p3){
2930: 0a 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20 20  .  if( p3 ){.   
2940: 20 73 77 69 74 63 68 28 20 70 33 74 79 70 65 20   switch( p3type 
2950: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 33  ){.      case P3
2960: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20  _DYNAMIC:.      
2970: 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a  case P3_KEYINFO:
2980: 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b  .      case P3_K
2990: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
29a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29b0: 46 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20  Free(p3);.      
29c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
29d0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 56  .      case P3_V
29e0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
29f0: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
2a00: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
2a10: 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20  nc *)p3;.       
2a20: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
2a30: 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46  teAuxData(pVdbeF
2a40: 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unc, 0);.       
2a50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 56 64 62   sqliteFree(pVdb
2a60: 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  eFunc);.        
2a70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2a80: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45 4d       case P3_MEM
2a90: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
2aa0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
2ab0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29  lite3_value*)p3)
2ac0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ae0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   }.}.../*.** Cha
2af0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2b00: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
2b10: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2b20: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
2b30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2b40: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
2b50: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
2b60: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
2b70: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
2b80: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
2b90: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
2ba0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
2bb0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
2bc0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
2bd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
2be0: 74 68 65 6e 20 74 68 65 20 50 33 20 6f 70 65 72  then the P3 oper
2bf0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
2c00: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
2c10: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
2c20: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
2c30: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
2c40: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
2c50: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
2c60: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
2c70: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
2c80: 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  3 up to and incl
2c90: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
2ca0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
2cb0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
2cc0: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 33  n+1 bytes of zP3
2cd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 33  ..**.** If n==P3
2ce0: 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e  _KEYINFO it mean
2cf0: 73 20 74 68 61 74 20 7a 50 33 20 69 73 20 61 20  s that zP3 is a 
2d00: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
2d10: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
2d20: 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  ** A copy is mad
2d30: 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f  e of the KeyInfo
2d40: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20   structure into 
2d50: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2d60: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 4d 61  from.** sqliteMa
2d70: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
2d80: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
2d90: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
2da0: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48   n==P3_KEYINFO_H
2db0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
2dc0: 20 74 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73   that zP3 points
2dd0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
2de0: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
2df0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
2e00: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
2e10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2e20: 6c 69 74 65 4d 61 6c 6c 6f 63 2e 20 54 68 65 20  liteMalloc. The 
2e30: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
2e40: 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61  d not free the a
2e50: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69  llocation, it wi
2e60: 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e  ll be freed when
2e70: 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20   the Vdbe is.** 
2e80: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a  finalized..** .*
2e90: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
2ea0: 66 20 6e 20 28 50 33 5f 53 54 41 54 49 43 2c 20  f n (P3_STATIC, 
2eb0: 50 33 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P3_COLLSEQ etc.)
2ec0: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
2ed0: 50 33 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P3 points.** to 
2ee0: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
2ef0: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
2f00: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
2f10: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
2f20: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
2f30: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
2f40: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
2f50: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
2f60: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
2f70: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 33 20 6f  then change P3 o
2f80: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
2f90: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
2fa0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
2fb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2fc0: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
2fd0: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
2fe0: 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29  har *zP3, int n)
2ff0: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  {.  Op *pOp;.  a
3000: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3010: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3020: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
3030: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 7b 0a 20  | p->aOp==0 ){. 
3040: 20 20 20 66 72 65 65 50 33 28 6e 2c 20 28 76 6f     freeP3(n, (vo
3050: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
3060: 33 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  3);.    return;.
3070: 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30    }.  if( addr<0
3080: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
3090: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
30a0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69  ->nOp - 1;.    i
30b0: 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75  f( addr<0 ) retu
30c0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20  rn;.  }.  pOp = 
30d0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
30e0: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
30f0: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3100: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3110: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3120: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
3130: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3140: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P3_NOTUSED;.  }
3150: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b  else if( n==P3_K
3160: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
3170: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
3180: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
3190: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 2f 2a 20   nByte;..    /* 
31a0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
31b0: 65 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 20  es that include 
31c0: 61 6e 20 4b 65 79 49 6e 66 6f 2e 61 53 6f 72 74  an KeyInfo.aSort
31d0: 4f 72 64 65 72 20 61 72 65 20 61 6c 77 61 79 73  Order are always
31e0: 0a 20 20 20 20 2a 2a 20 73 65 6e 74 20 69 6e 20  .    ** sent in 
31f0: 75 73 69 6e 67 20 50 33 5f 4b 45 59 49 4e 46 4f  using P3_KEYINFO
3200: 5f 48 41 4e 44 4f 46 46 2e 20 20 54 68 65 20 4b  _HANDOFF.  The K
3210: 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65  eyInfo.aSortOrde
3220: 72 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69  r array.    ** i
3230: 73 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  s not duplicated
3240: 20 77 68 65 6e 20 50 33 5f 4b 45 59 49 4e 46 4f   when P3_KEYINFO
3250: 20 69 73 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20   is used. */.   
3260: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4b 65 79   /* assert( pKey
3270: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3280: 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 6e 46  ==0 ); */.    nF
3290: 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f  ield = ((KeyInfo
32a0: 2a 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a  *)zP3)->nField;.
32b0: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
32c0: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20  of(*pKeyInfo) + 
32d0: 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f  (nField-1)*sizeo
32e0: 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  f(pKeyInfo->aCol
32f0: 6c 5b 30 5d 29 3b 0a 20 20 20 20 70 4b 65 79 49  l[0]);.    pKeyI
3300: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
3310: 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a  ocRaw( nByte );.
3320: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
3330: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 3b 0a 20  har*)pKeyInfo;. 
3340: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
3350: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
3360: 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e  pKeyInfo, zP3, n
3370: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 4f 70  Byte);.      pOp
3380: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45  ->p3type = P3_KE
3390: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
33a0: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  {.      pOp->p3t
33b0: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
33c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
33d0: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
33e0: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
33f0: 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72   pOp->p3 = (char
3400: 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP3;.    pOp->
3410: 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49  p3type = P3_KEYI
3420: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
3430: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
3440: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
3450: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3460: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
3470: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
3480: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 3b 0a   = strlen(zP3);.
3490: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71      pOp->p3 = sq
34a0: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 50 33 2c  liteStrNDup(zP3,
34b0: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33   n);.    pOp->p3
34c0: 74 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49  type = P3_DYNAMI
34d0: 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  C;.  }.}..#ifnde
34e0: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
34f0: 65 70 6c 61 63 65 20 74 68 65 20 50 33 20 66 69  eplace the P3 fi
3500: 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
3510: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
3520: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 0a  nstruction with.
3530: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e  ** comment text.
3540: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3550: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
3560: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3570: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
3580: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3590: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
35a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
35b0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
35c0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d 3d  p[p->nOp-1].p3==
35d0: 30 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  0 );.  va_start(
35e0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
35f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3600: 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69 74  eP3(p, -1, sqlit
3610: 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d  e3VMPrintf(zForm
3620: 61 74 2c 20 61 70 29 2c 20 50 33 5f 44 59 4e 41  at, ap), P3_DYNA
3630: 4d 49 43 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61  MIC);.  va_end(a
3640: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
3650: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
3660: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
3670: 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64  n address..*/.Vd
3680: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
3690: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
36a0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73  int addr){.  ass
36b0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
36c0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
36d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
36e0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
36f0: 4f 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 26  Op );.  return &
3700: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 7d 0a  p->aOp[addr];.}.
3710: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
3720: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
3730: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
3740: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
3750: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
3760: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
3770: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
3780: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
3790: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
37a0: 72 69 62 65 73 20 74 68 65 20 50 33 20 70 61 72  ribes the P3 par
37b0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
37c0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
37d0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
37e0: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
37f0: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
3800: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
3810: 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63  layP3(Op *pOp, c
3820: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
3830: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
3840: 7a 50 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  zP3;.  assert( n
3850: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
3860: 69 74 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70  itch( pOp->p3typ
3870: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33  e ){.    case P3
3880: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
3890: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
38a0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
38b0: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
38c0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
38d0: 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 6b  printf(zTemp, "k
38e0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
38f0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
3900: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
3910: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
3920: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
3930: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
3940: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
3950: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
3960: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
3970: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
3980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
3990: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
39a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
39b0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
39c0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
39d0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d      strcpy(&zTem
39e0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 29 3b 0a 20 20  p[i],",...");.  
39f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3a00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3a10: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
3a20: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ] = ',';.       
3a30: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
3a40: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70  >aSortOrder && p
3a50: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3a60: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
3a70: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
3a80: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
3a90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 74    }.          st
3aa0: 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  rcpy(&zTemp[i], 
3ab0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
3ac0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
3ad0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
3ae0: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
3af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 63  {.          strc
3b00: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
3b10: 69 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  il");.          
3b20: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
3b30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
3b40: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
3b50: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
3b60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
3b70: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
3b80: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
3b90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3ba0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33     }.    case P3
3bb0: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
3bc0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
3bd0: 20 3d 20 28 43 6f 6c 6c 53 65 71 2a 29 70 4f 70   = (CollSeq*)pOp
3be0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 70 72 69  ->p3;.      spri
3bf0: 6e 74 66 28 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c  ntf(zTemp, "coll
3c00: 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  seq(%.20s)", pCo
3c10: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
3c20: 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP3 = zTemp;. 
3c30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3c40: 7d 0a 20 20 20 20 63 61 73 65 20 50 33 5f 46 55  }.    case P3_FU
3c50: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
3c60: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 28  uncDef *pDef = (
3c70: 46 75 6e 63 44 65 66 2a 29 70 4f 70 2d 3e 70 33  FuncDef*)pOp->p3
3c80: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 75  ;.      char zNu
3c90: 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72  m[30];.      spr
3ca0: 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 25 2e 2a  intf(zTemp, "%.*
3cb0: 73 22 2c 20 6e 54 65 6d 70 2c 20 70 44 65 66 2d  s", nTemp, pDef-
3cc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
3cd0: 70 72 69 6e 74 66 28 7a 4e 75 6d 2c 22 28 25 64  printf(zNum,"(%d
3ce0: 29 22 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  )", pDef->nArg);
3cf0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65  .      if( strle
3d00: 6e 28 7a 54 65 6d 70 29 2b 73 74 72 6c 65 6e 28  n(zTemp)+strlen(
3d10: 7a 4e 75 6d 29 2b 31 3c 3d 6e 54 65 6d 70 20 29  zNum)+1<=nTemp )
3d20: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 61 74  {.        strcat
3d30: 28 7a 54 65 6d 70 2c 20 7a 4e 75 6d 29 3b 0a 20  (zTemp, zNum);. 
3d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 33       }.      zP3
3d50: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
3d60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3d70: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3d80: 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b    zP3 = pOp->p3;
3d90: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 33 3d 3d  .      if( zP3==
3da0: 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  0 || pOp->opcode
3db0: 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  ==OP_Noop ){.   
3dc0: 20 20 20 20 20 7a 50 33 20 3d 20 22 22 3b 0a 20       zP3 = "";. 
3dd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3de0: 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b 0a 7d  .  return zP3;.}
3df0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65  .#endif...#if de
3e00: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
3e10: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
3e20: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
3e30: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
3e40: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
3e50: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3e60: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
3e70: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
3e80: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
3e90: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
3ea0: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
3eb0: 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61 72  har *zP3;.  char
3ec0: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
3ed0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3ee0: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
3ef0: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 73  %-13s %4d %4d %s
3f00: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
3f10: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
3f20: 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73 70  ut;.  zP3 = disp
3f30: 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72 2c  layP3(pOp, zPtr,
3f40: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
3f50: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
3f60: 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20 20  zFormat1,.      
3f70: 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  pc, sqlite3Opcod
3f80: 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f  eNames[pOp->opco
3f90: 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de], pOp->p1, pO
3fa0: 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20 66  p->p2, zP3);.  f
3fb0: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
3fc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
3fd0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
3fe0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
3ff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
4000: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
4010: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
4020: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68   if( p ){.    wh
4030: 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20  ile( N-->0 ){.  
4040: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
4050: 65 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a  emRelease(p++);.
4060: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
4070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4080: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47  _EXPLAIN./*.** G
4090: 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  ive a listing of
40a0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20   the program in 
40b0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
40c0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
40d0: 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20  nterface is the 
40e0: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56  same as sqlite3V
40f0: 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20  dbeExec().  But 
4100: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75  instead of.** ru
4110: 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20  nning the code, 
4120: 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  it invokes the c
4130: 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72  allback once for
4140: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
4150: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  n..** This featu
4160: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  re is used to im
4170: 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e  plement "EXPLAIN
4180: 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  "..*/.int sqlite
4190: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
41a0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
41b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
41c0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  BE */.){.  sqlit
41d0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
41e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
41f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
4200: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
4210: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  lain );.  if( p-
4220: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
4230: 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20  IC_RUN ) return 
4240: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
4250: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67   assert( db->mag
4260: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
4270: 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72  _BUSY );.  asser
4280: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
4290: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
42a0: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20  LITE_BUSY );..  
42b0: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
42c0: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
42d0: 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d 69 63 20  not put dynamic 
42e0: 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65  strings onto the
42f0: 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c  .  ** the stack,
4300: 20 74 68 65 79 20 6d 61 79 20 62 65 63 6f 6d 65   they may become
4310: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
4320: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
4330: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4340: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
4350: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
4360: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
4370: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  g..  */.  if( p-
4380: 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61 53 74 61 63  >pTos==&p->aStac
4390: 6b 5b 34 5d 20 29 7b 0a 20 20 20 20 72 65 6c 65  k[4] ){.    rele
43a0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
43b0: 53 74 61 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a 20  Stack, 5);.  }. 
43c0: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
43d0: 20 30 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69   0;..  do{.    i
43e0: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77   = p->pc++;.  }w
43f0: 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26  hile( i<p->nOp &
4400: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
4410: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
4420: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
4430: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
4440: 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  Op ){.    p->rc 
4450: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4460: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
4470: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
4480: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4490: 45 5f 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  E_Interrupt ){. 
44a0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
44b0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70  ~SQLITE_Interrup
44c0: 74 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  t;.    p->rc = S
44d0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
44e0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
44f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
4500: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
4510: 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  >zErrMsg, sqlite
4520: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20  3ErrStr(p->rc), 
4530: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c  (char*)0);.  }el
4540: 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20  se{.    Op *pOp 
4550: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
4560: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
4570: 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65  >aStack;.    pMe
4580: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
4590: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  nt;.    pMem->ty
45a0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
45b0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69  GER;.    pMem->i
45c0: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45e0: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
45f0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  counter */.    p
4600: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
4610: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
4620: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
4630: 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d  _Term;.    pMem-
4640: 3e 7a 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  >z = sqlite3Opco
4650: 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63  deNames[pOp->opc
4660: 6f 64 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f 64 65  ode];  /* Opcode
4670: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20   */.    pMem->n 
4680: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
4690: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  );.    pMem->typ
46a0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
46b0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
46c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
46d0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
46e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
46f0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
4700: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
4730: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
4740: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
4750: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
4760: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
4770: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
4780: 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  ->i = pOp->p2;  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
47b0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
47c0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
47d0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
47e0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
47f0: 20 4d 45 4d 5f 53 68 6f 72 74 7c 4d 45 4d 5f 53   MEM_Short|MEM_S
4800: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 2f  tr|MEM_Term;   /
4810: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P3 */.    pMem
4820: 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 33 28  ->z = displayP3(
4830: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72  pOp, pMem->zShor
4840: 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  t, sizeof(pMem->
4850: 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 70 4d  zShort));.    pM
4860: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
4870: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
4880: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
4890: 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65  TF8;..    p->nRe
48a0: 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32 2a  sColumn = 5 - 2*
48b0: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
48c0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d      p->pTos = pM
48d0: 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  em;.    p->rc = 
48e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
48f0: 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 31  ->resOnStack = 1
4900: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
4910: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
4920: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
4930: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4940: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  EXPLAIN */../*.*
4950: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
4960: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
4970: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
4980: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
4990: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
49a0: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
49b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
49c0: 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  BUG.  int nOp = 
49d0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
49e0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
49f0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
4a00: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70  Op = &p->aOp[nOp
4a10: 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  -1];.  if( pOp->
4a20: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20  opcode==OP_Noop 
4a30: 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b  && pOp->p3!=0 ){
4a40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4a50: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  *z = pOp->p3;.  
4a60: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
4a70: 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b  (*(u8*)z) ) z++;
4a80: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
4a90: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
4aa0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
4ab0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
4ac0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
4ad0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69   execution.  Thi
4ae0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
4af0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
4b00: 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70  ocating stack sp
4b10: 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ace and initiali
4b20: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
4b30: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
4b40: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
4b50: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
4b60: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
4b70: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
4b80: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
4b90: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
4ba0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
4bb0: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
4bc0: 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44  e a VDBE from VD
4bd0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f  BE_MAGIC_INIT to
4be0: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  .** VDBE_MAGIC_R
4bf0: 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  UN..*/.void sqli
4c00: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
4c10: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
4c40: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20  /.  int nVar,   
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4c70: 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53  '?' see in the S
4c80: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
4c90: 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20    int nMem,     
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65   /* Number of me
4cc0: 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c  mory cells to al
4cd0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
4ce0: 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  nCursor,        
4cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4d00: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
4d10: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
4d20: 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20   int isExplain  
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45  /* True if the E
4d50: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20  XPLAIN keywords 
4d60: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b  is present */.){
4d70: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73  .  int n;..  ass
4d80: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
4d90: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4da0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4db0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
4dc0: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
4dd0: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
4de0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
4df0: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
4e00: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
4e10: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
4e20: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
4e30: 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20  an later. This. 
4e40: 20 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74    * is because t
4e50: 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a  he call to resiz
4e60: 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77  eOpArray() below
4e70: 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a   may shrink the.
4e80: 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72     * p->aOp[] ar
4e90: 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f  ray to save memo
4ea0: 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65  ry if called whe
4eb0: 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f  n in VDBE_MAGIC_
4ec0: 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e  RUN .   * state.
4ed0: 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  .   */.  p->magi
4ee0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
4ef0: 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73  UN;..  /* No ins
4f00: 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75  truction ever pu
4f10: 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  shes more than a
4f20: 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20   single element 
4f30: 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74  onto the.  ** st
4f40: 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74  ack.  And the st
4f50: 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20  ack never grows 
4f60: 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78  on successive ex
4f70: 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ecutions of the.
4f80: 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20    ** same loop. 
4f90: 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   So the total nu
4fa0: 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74  mber of instruct
4fb0: 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72  ions is an upper
4fc0: 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74   bound.  ** on t
4fd0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b  he maximum stack
4fe0: 20 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e   depth required.
4ff0: 20 20 28 41 64 64 65 64 20 6c 61 74 65 72 3a 29    (Added later:)
5000: 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73 6f 6c    The.  ** resol
5010: 76 65 50 32 56 61 6c 75 65 73 28 29 20 63 61 6c  veP2Values() cal
5020: 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74 69 67  l computes a tig
5030: 68 74 65 72 20 75 70 70 65 72 20 62 6f 75 6e 64  hter upper bound
5040: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73 74 61   on the.  ** sta
5050: 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20 20  ck size..  **.  
5060: 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c  ** Allocation al
5070: 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61 63  l the stack spac
5080: 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20 6e  e we will ever n
5090: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
50a0: 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a  p->aStack==0 ){.
50b0: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20      int nArg;   
50c0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
50d0: 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61  umber of args pa
50e0: 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66  ssed to a user f
50f0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
5100: 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20  int nStack;     
5110: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
5120: 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72 69  r of stack entri
5130: 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  es required */. 
5140: 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75     resolveP2Valu
5150: 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26 6e 53  es(p, &nArg, &nS
5160: 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73 69 7a  tack);.    resiz
5170: 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e  eOpArray(p, p->n
5180: 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Op);.    assert(
5190: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20   nVar>=0 );.    
51a0: 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b 3c 70  assert( nStack<p
51b0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 6e 53 74  ->nOp );.    nSt
51c0: 61 63 6b 20 3d 20 69 73 45 78 70 6c 61 69 6e 20  ack = isExplain 
51d0: 3f 20 31 30 20 3a 20 6e 53 74 61 63 6b 3b 0a 20  ? 10 : nStack;. 
51e0: 20 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73     p->aStack = s
51f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20  qliteMalloc(.   
5200: 20 20 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a 65       nStack*size
5210: 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29  of(p->aStack[0])
5220: 20 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f      /* aStack */
5230: 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69  .      + nArg*si
5240: 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20  zeof(Mem*)      
5250: 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67          /* apArg
5260: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72   */.      + nVar
5270: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20  *sizeof(Mem)    
5280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56             /* aV
5290: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56  ar */.      + nV
52a0: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52c0: 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b  azVar */.      +
52d0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
52e0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
52f0: 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20  /* aMem */.     
5300: 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f   + nCursor*sizeo
5310: 66 28 43 75 72 73 6f 72 2a 29 20 20 20 20 20 20  f(Cursor*)      
5320: 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20    /* apCsr */.  
5330: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71    );.    if( !sq
5340: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
5350: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  led ){.      p->
5360: 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63  aMem = &p->aStac
5370: 6b 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20  k[nStack];.     
5380: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
5390: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  .      p->aVar =
53a0: 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b   &p->aMem[nMem];
53b0: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  .      p->nVar =
53c0: 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e   nVar;.      p->
53d0: 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20  okVar = 0;.     
53e0: 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d   p->apArg = (Mem
53f0: 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72  **)&p->aVar[nVar
5400: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61  ];.      p->azVa
5410: 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e  r = (char**)&p->
5420: 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20  apArg[nArg];.   
5430: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43     p->apCsr = (C
5440: 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61  ursor**)&p->azVa
5450: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
5460: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
5470: 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e  sor;.      for(n
5480: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
5490: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61  {.        p->aVa
54a0: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
54b0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Null;.      }. 
54c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e     }.  }.  for(n
54d0: 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e  =0; n<p->nMem; n
54e0: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  ++){.    p->aMem
54f0: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
5500: 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  Null;.  }..#ifde
5510: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
5520: 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61   if( (p->db->fla
5530: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
5540: 4c 69 73 74 69 6e 67 29 21 3d 30 0a 20 20 20 20  Listing)!=0.    
5550: 7c 7c 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  || sqlite3OsFile
5560: 45 78 69 73 74 73 28 22 76 64 62 65 5f 65 78 70  Exists("vdbe_exp
5570: 6c 61 69 6e 22 29 0a 20 20 29 7b 0a 20 20 20 20  lain").  ){.    
5580: 69 6e 74 20 69 3b 0a 20 20 20 20 70 72 69 6e 74  int i;.    print
5590: 66 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20  f("VDBE Program 
55a0: 4c 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20  Listing:\n");.  
55b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
55c0: 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 66 6f  ntSql(p);.    fo
55d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
55e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
55f0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
5600: 73 74 64 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  stdout, i, &p->a
5610: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  Op[i]);.    }.  
5620: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  }.  if( sqlite3O
5630: 73 46 69 6c 65 45 78 69 73 74 73 28 22 76 64 62  sFileExists("vdb
5640: 65 5f 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20  e_trace") ){.   
5650: 20 70 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f   p->trace = stdo
5660: 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ut;.  }.#endif. 
5670: 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61   p->pTos = &p->a
5680: 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e  Stack[-1];.  p->
5690: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
56a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
56b0: 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30  p->uniqueCnt = 0
56c0: 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70  ;.  p->returnDep
56d0: 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72  th = 0;.  p->err
56e0: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
56f0: 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61  ort;.  p->popSta
5700: 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78  ck =  0;.  p->ex
5710: 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61  plain |= isExpla
5720: 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  in;.  p->magic =
5730: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
5740: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
5750: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
5760: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69  ROFILE.  {.    i
5770: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
5780: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
5790: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  ){.      p->aOp[
57a0: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
57b0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
57c0: 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  es = 0;.    }.  
57d0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
57e0: 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
57f0: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
5800: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
5810: 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70 65  hat cursor happe
5820: 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ns.** to hold..*
5830: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5840: 62 65 46 72 65 65 43 75 72 73 6f 72 28 43 75 72  beFreeCursor(Cur
5850: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
5860: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
5870: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
5880: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
5890: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
58a0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
58b0: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
58c0: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
58d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
58e0: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
58f0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
5900: 72 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b  ree(pCx->pData);
5910: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
5920: 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c  x->aType);.  sql
5930: 69 74 65 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a  iteFree(pCx);.}.
5940: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
5950: 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74   cursors.*/.stat
5960: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
5970: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
5980: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
5990: 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72   p->apCsr==0 ) r
59a0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
59b0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
59c0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
59d0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
59e0: 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  p->apCsr[i]);.  
59f0: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
5a00: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
5a10: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
5a20: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
5a30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5a40: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
5a50: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
5a60: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
5a70: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
5a80: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
5a90: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
5aa0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
5ab0: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
5ac0: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
5ad0: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
5ae0: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
5af0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
5b00: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61  i;.  if( p->aSta
5b10: 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  ck ){.    releas
5b20: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74  eMemArray(p->aSt
5b30: 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f  ack, 1 + (p->pTo
5b40: 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b  s - p->aStack));
5b50: 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26  .    p->pTos = &
5b60: 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20  p->aStack[-1];. 
5b70: 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
5b80: 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65 61  sors(p);.  relea
5b90: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  seMemArray(p->aM
5ba0: 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  em, p->nMem);.  
5bb0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43  sqlite3VdbeFifoC
5bc0: 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b  lear(&p->sFifo);
5bd0: 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78  .  if( p->contex
5be0: 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  tStack ){.    fo
5bf0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74  r(i=0; i<p->cont
5c00: 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b  extStackTop; i++
5c10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5c20: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
5c30: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69  ->contextStack[i
5c40: 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a  ].sFifo);.    }.
5c50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
5c60: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b  ->contextStack);
5c70: 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78  .  }.  p->contex
5c80: 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d  tStack = 0;.  p-
5c90: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70  >contextStackDep
5ca0: 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e  th = 0;.  p->con
5cb0: 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30  textStackTop = 0
5cc0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
5cd0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
5ce0: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a  >zErrMsg = 0;.}.
5cf0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
5d00: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
5d10: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
5d20: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
5d30: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
5d40: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
5d50: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
5d60: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
5d70: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
5d80: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
5d90: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
5da0: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
5db0: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
5dc0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
5dd0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
5de0: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
5df0: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
5e00: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
5e10: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
5e20: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
5e30: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
5e40: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 72 65 6c 65  .  int n;.  rele
5e50: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
5e60: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
5e70: 43 6f 6c 75 6d 6e 2a 32 29 3b 0a 20 20 73 71 6c  Column*2);.  sql
5e80: 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e  iteFree(p->aColN
5e90: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
5ea0: 43 6f 6c 75 6d 6e 2a 32 3b 0a 20 20 70 2d 3e 6e  Column*2;.  p->n
5eb0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73  ResColumn = nRes
5ec0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
5ed0: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
5ee0: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 4d   = (Mem*)sqliteM
5ef0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 4d 65  alloc( sizeof(Me
5f00: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
5f10: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
5f20: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
5f30: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 28  n-- > 0 ){.    (
5f40: 70 43 6f 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61  pColName++)->fla
5f50: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
5f60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
5f70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5f80: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
5f90: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
5fa0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
5fb0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
5fc0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
5fd0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
5fe0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
5ff0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
6000: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
6010: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
6020: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
6030: 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53  **.** If N==P3_S
6040: 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20  TATIC  it means 
6050: 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20  that zName is a 
6060: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e  pointer to a con
6070: 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20  stant static.** 
6080: 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61  string and we ca
6090: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
60a0: 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69  pointer. If it i
60b0: 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68  s P3_DYNAMIC, th
60c0: 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e  en .** the strin
60d0: 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e 67  g is freed using
60e0: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 77 68   sqliteFree() wh
60f0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 66  en the vdbe is f
6100: 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20  inished with.** 
6110: 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e  it. Otherwise, N
6120: 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20   bytes of zName 
6130: 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69  are copied..*/.i
6140: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
6150: 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70  tColName(Vdbe *p
6160: 2c 20 69 6e 74 20 69 64 78 2c 20 63 6f 6e 73 74  , int idx, const
6170: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
6180: 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  t N){.  int rc;.
6190: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
61a0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 28  .  assert( idx<(
61b0: 32 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29  2*p->nResColumn)
61c0: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
61d0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
61e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
61f0: 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28  NOMEM;.  assert(
6200: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
6210: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
6220: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
6230: 78 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33  x]);.  if( N==P3
6240: 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50  _DYNAMIC || N==P
6250: 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20  3_STATIC ){.    
6260: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
6270: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
6280: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
6290: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
62a0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  TE_STATIC);.  }e
62b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
62c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
62d0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
62e0: 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54  me, N, SQLITE_UT
62f0: 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  F8,SQLITE_TRANSI
6300: 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ENT);.  }.  if( 
6310: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6320: 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29   N==P3_DYNAMIC )
6330: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
6340: 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d  flags = (pColNam
6350: 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53  e->flags&(~MEM_S
6360: 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b  tatic))|MEM_Dyn;
6370: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78  .    pColName->x
6380: 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Del = 0;.  }.  r
6390: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
63a0: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
63b0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
63c0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
63d0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
63e0: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
63f0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
6400: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
6410: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
6420: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
6430: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
6440: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
6450: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
6460: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
6470: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
6480: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6490: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
64a0: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
64b0: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
64c0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
64d0: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
64e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
64f0: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
6500: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
6510: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
6520: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6530: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
6540: 69 74 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  it = 0;..  for(i
6550: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6560: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
6570: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
6580: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
6590: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
65a0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
65b0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
65c0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
65d0: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
65e0: 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ns++;.    }.  }.
65f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
6600: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
6610: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
6620: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
6630: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
6640: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
6650: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
6660: 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  back ){.    int 
6670: 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rc;.    sqlite3S
6680: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
6690: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
66a0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
66b0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
66c0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
66d0: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  db);.    if( rc 
66e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
66f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
6700: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
6710: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
6720: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
6730: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
6740: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
6750: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
6760: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
6770: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
6780: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
6790: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
67a0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
67b0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
67c0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
67d0: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
67e0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
67f0: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
6800: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
6810: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
6820: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
6830: 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ry:.  In that ca
6840: 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f  se we do.  ** no
6850: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
6860: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
6870: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
6880: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
6890: 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a  .  ** too..  */.
68a0: 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28    if( 0==strlen(
68b0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
68c0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
68d0: 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61  0].pBt)) || nTra
68e0: 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  ns<=1 ){.    for
68f0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
6900: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
6910: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
6920: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6930: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6940: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6950: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6960: 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20  3BtreeSync(pBt, 
6970: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6980: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
6990: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
69a0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
69b0: 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
69c0: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  d */.    if( rc=
69d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
69e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
69f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6a00: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
6a10: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6a20: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
6a30: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
6a40: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
6a50: 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  it(pBt);.       
6a60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6a70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
6a80: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
6a90: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
6aa0: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
6ab0: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
6ac0: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
6ad0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6ae0: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
6af0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6b00: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
6b10: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
6b20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6b30: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
6b40: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65  lse{.    int nee
6b50: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
6b60: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
6b70: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
6b80: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
6b90: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
6ba0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
6bb0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
6bc0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
6bd0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
6be0: 20 20 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65      OsFile maste
6bf0: 72 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  r;..    /* Selec
6c00: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
6c10: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
6c20: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
6c30: 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  32 random;.     
6c40: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
6c50: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
6c60: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
6c70: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
6c80: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
6c90: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
6ca0: 50 72 69 6e 74 66 28 22 25 73 2d 6d 6a 25 30 38  Printf("%s-mj%08
6cb0: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72  X", zMainFile, r
6cc0: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
6cd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
6ce0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
6cf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6d00: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
6d10: 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65    }while( sqlite
6d20: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d  3OsFileExists(zM
6d30: 61 73 74 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f  aster) );..    /
6d40: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
6d50: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
6d60: 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74 65 72    memset(&master
6d70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74  , 0, sizeof(mast
6d80: 65 72 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  er));.    rc = s
6d90: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
6da0: 75 73 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26  usive(zMaster, &
6db0: 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  master, 0);.    
6dc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6dd0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
6de0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
6df0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6e00: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
6e10: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
6e20: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
6e30: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
6e40: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
6e50: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
6e60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
6e70: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6e80: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
6e90: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
6ea0: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
6eb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6ec0: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
6ed0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
6ee0: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
6ef0: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
6f00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6f10: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
6f20: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
6f30: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
6f40: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
6f50: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
6f60: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
6f70: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6f80: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
6f90: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6fa0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
6fb0: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
6fc0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
6fd0: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a   TEMP database *
6fe0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  /.      if( pBt 
6ff0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
7000: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
7010: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
7020: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
7030: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
7040: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
7050: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
7060: 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  0]==0 ) continue
7070: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65  ;  /* Ignore :me
7080: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
7090: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
70a0: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
70b0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
70c0: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
70d0: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
70e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
70f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
7100: 69 74 65 33 4f 73 57 72 69 74 65 28 26 6d 61 73  ite3OsWrite(&mas
7110: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c  ter, zFile, strl
7120: 65 6e 28 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20  en(zFile)+1);.  
7130: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
7140: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7150: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
7160: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
7170: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
7180: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
7190: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
71a0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
71b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
71c0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
71d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a        }.    }...
71e0: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
71f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7200: 69 6c 65 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ile. Before doin
7210: 67 20 74 68 69 73 2c 20 6f 70 65 6e 20 74 68 65  g this, open the
7220: 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 2a   directory.    *
7230: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
7240: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 74 6f  rnal file is sto
7250: 72 65 20 69 6e 20 73 6f 20 74 68 61 74 20 69 74  re in so that it
7260: 20 67 65 74 73 20 73 79 6e 63 65 64 20 74 6f 6f   gets synced too
7270: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
7280: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
7290: 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
72a0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
72b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
72c0: 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
72d0: 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 26 6d 61 73  (zMainFile, &mas
72e0: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
72f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  !=SQLITE_OK ||. 
7300: 20 20 20 20 20 20 20 20 20 28 6e 65 65 64 53 79           (needSy
7310: 6e 63 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65  nc && (rc=sqlite
7320: 33 4f 73 53 79 6e 63 28 26 6d 61 73 74 65 72 2c  3OsSync(&master,
7330: 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  0))!=SQLITE_OK) 
7340: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7350: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
7360: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
7370: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
7380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
7390: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
73a0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
73b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
73c0: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
73d0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
73e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
73f0: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
7400: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
7410: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
7420: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
7430: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
7440: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
7450: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
7460: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
7470: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7480: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
7490: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
74a0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
74b0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
74c0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  o sqlite3BtreeSy
74d0: 6e 63 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65  nc(),.    ** the
74e0: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
74f0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6d 61 73  nce that the mas
7500: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7510: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
7520: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
7530: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
7540: 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  t, in case the m
7550: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
7560: 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 20 77    ** file name w
7570: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
7580: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7590: 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
75a0: 75 72 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72  ure.    ** occur
75b0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
75c0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
75d0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
75e0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
75f0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
7600: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
7610: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
7620: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
7630: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7640: 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20 7a  BtreeSync(pBt, z
7650: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
7660: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7670: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
7680: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7690: 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  master);.       
76a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
76b0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
76c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
76d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
76e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
76f0: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
7700: 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  ;..    /* Delete
7710: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7720: 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
7730: 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
7740: 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
7750: 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
7760: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
7770: 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
7780: 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
7790: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
77a0: 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
77b0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
77c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
77d0: 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65  3OsDelete(zMaste
77e0: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
77f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
7800: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
7810: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
7820: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
7830: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
7840: 63 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e  cDirectory(zMain
7850: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
7860: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7870: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
7880: 20 6e 6f 74 20 67 6f 6f 64 2e 20 54 68 65 20 6d   not good. The m
7890: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
78a0: 6c 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  le has been dele
78b0: 74 65 64 2c 20 62 75 74 0a 20 20 20 20 20 20 2a  ted, but.      *
78c0: 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
78d0: 73 79 6e 63 20 66 61 69 6c 65 64 2e 20 54 68 65  sync failed. The
78e0: 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 74  re is no complet
78f0: 65 6c 79 20 73 61 66 65 20 63 6f 75 72 73 65 20  ely safe course 
7900: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69  of.      ** acti
7910: 6f 6e 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  on from here. Th
7920: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
7930: 72 6e 61 6c 73 20 63 6f 6e 74 61 69 6e 20 74 68  rnals contain th
7940: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20 20  e name of the.  
7950: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
7960: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 62 75 74 20  urnal file, but 
7970: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
7980: 6f 66 20 6b 6e 6f 77 69 6e 67 20 69 66 20 74 68  of knowing if th
7990: 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74  at.      ** mast
79a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
79b0: 73 20 6e 6f 77 20 6f 72 20 69 66 20 69 74 20 77  s now or if it w
79c0: 69 6c 6c 20 65 78 69 73 74 20 61 66 74 65 72 20  ill exist after 
79d0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20  the operating.  
79e0: 20 20 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72      ** system cr
79f0: 61 73 68 20 74 68 61 74 20 6d 61 79 20 66 6f 6c  ash that may fol
7a00: 6c 6f 77 20 74 68 65 20 66 73 79 6e 63 28 29 20  low the fsync() 
7a10: 66 61 69 6c 75 72 65 2e 0a 20 20 20 20 20 20 2a  failure..      *
7a20: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
7a30: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
7a40: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
7a50: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
7a60: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
7a70: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
7a80: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
7a90: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
7aa0: 65 65 43 6f 6d 6d 69 74 28 29 20 61 72 65 20 6f  eeCommit() are o
7ab0: 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
7ac0: 73 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 0a 20  s and deleting. 
7ad0: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20     ** journals. 
7ae0: 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
7af0: 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 20 74 68  s wrong while th
7b00: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
7b10: 77 65 20 64 6f 6e 27 74 0a 20 20 20 20 2a 2a 20  we don't.    ** 
7b20: 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
7b30: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
7b40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
7b50: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
7b60: 65 65 64 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  eed,.    ** but 
7b70: 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
7b80: 27 20 6a 6f 75 72 6e 61 6c 73 20 6d 61 79 20 62  ' journals may b
7b90: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
7ba0: 52 65 74 75 72 6e 69 6e 67 20 61 6e 0a 20 20 20  Returning an.   
7bb0: 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 77   ** error code w
7bc0: 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
7bd0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
7be0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
7bf0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
7c00: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
7c10: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
7c20: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
7c30: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
7c40: 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  eCommit(pBt);.  
7c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7c60: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
7c70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
7c80: 6e 64 20 65 76 65 72 79 20 61 63 74 69 76 65 20  nd every active 
7c90: 56 4d 20 6f 74 68 65 72 20 74 68 61 6e 20 70 56  VM other than pV
7ca0: 64 62 65 20 61 6e 64 20 63 68 61 6e 67 65 20 69  dbe and change i
7cb0: 74 73 20 73 74 61 74 75 73 20 74 6f 0a 2a 2a 20  ts status to.** 
7cc0: 61 62 6f 72 74 65 64 2e 20 20 54 68 69 73 20 68  aborted.  This h
7cd0: 61 70 70 65 6e 73 20 77 68 65 6e 20 6f 6e 65 20  appens when one 
7ce0: 56 4d 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  VM causes a roll
7cf0: 62 61 63 6b 20 64 75 65 20 74 6f 20 61 6e 0a 2a  back due to an.*
7d00: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f  * ON CONFLICT RO
7d10: 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65 20 28 66  LLBACK clause (f
7d20: 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20 20 54 68  or example).  Th
7d30: 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74  e other VMs must
7d40: 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65 64 20 73   be.** aborted s
7d50: 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e  o that they do n
7d60: 6f 74 20 68 61 76 65 20 64 61 74 61 20 72 6f 6c  ot have data rol
7d70: 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  led out from und
7d80: 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68 65 6d 20  erneath.** them 
7d90: 6c 65 61 64 69 6e 67 20 74 6f 20 61 20 73 65 67  leading to a seg
7da0: 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  fault..*/.static
7db0: 20 76 6f 69 64 20 61 62 6f 72 74 4f 74 68 65 72   void abortOther
7dc0: 41 63 74 69 76 65 56 64 62 65 73 28 56 64 62 65  ActiveVdbes(Vdbe
7dd0: 20 2a 70 56 64 62 65 29 7b 0a 20 20 56 64 62 65   *pVdbe){.  Vdbe
7de0: 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f 72 28   *pOther;.  for(
7df0: 70 4f 74 68 65 72 3d 70 56 64 62 65 2d 3e 64 62  pOther=pVdbe->db
7e00: 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72 3b  ->pVdbe; pOther;
7e10: 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d 3e   pOther=pOther->
7e20: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
7e30: 70 4f 74 68 65 72 3d 3d 70 56 64 62 65 20 29 20  pOther==pVdbe ) 
7e40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
7e50: 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67 69 63 21  ( pOther->magic!
7e60: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
7e70: 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63 3c 30 20  || pOther->pc<0 
7e80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7e90: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
7ea0: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 70 4f 74  pOther);.    pOt
7eb0: 68 65 72 2d 3e 61 62 6f 72 74 65 64 20 3d 20 31  her->aborted = 1
7ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
7ed0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
7ee0: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
7ef0: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
7f00: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
7f10: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
7f20: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
7f30: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
7f40: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
7f50: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
7f60: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
7f70: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
7f80: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
7f90: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
7fa0: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
7fb0: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
7fc0: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
7fd0: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
7fe0: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
7ff0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
8000: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
8010: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
8020: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
8030: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
8040: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
8050: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
8060: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
8070: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
8080: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
8090: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
80a0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
80b0: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
80c0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
80d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
80e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
80f0: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
8100: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
8110: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
8120: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
8130: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
8140: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8150: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
8160: 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
8170: 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
8180: 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
8190: 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
81a0: 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
81b0: 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
81c0: 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
81d0: 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
81e0: 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
81f0: 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
8200: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
8210: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
8220: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
8230: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
8240: 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
8250: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
8260: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
8270: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
8280: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
8290: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
82a0: 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
82b0: 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
82c0: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
82d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
82e0: 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
82f0: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
8300: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
8310: 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
8320: 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
8330: 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
8340: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
8350: 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
8360: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8370: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
8380: 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42    int (*xFunc)(B
8390: 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20  tree *pBt) = 0; 
83a0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
83b0: 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72  call on each btr
83c0: 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 0a 20  ee backend */.. 
83d0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
83e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
83f0: 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  .    /* Already 
8400: 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67  halted.  Nothing
8410: 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61   to do. */.    a
8420: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
8430: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
8440: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
8450: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8460: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
8470: 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  p);.  checkActiv
8480: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
8490: 69 66 28 20 70 2d 3e 70 63 3c 30 20 29 7b 0a 20  if( p->pc<0 ){. 
84a0: 20 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20     /* No commit 
84b0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
84c0: 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
84d0: 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
84e0: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  */.  }else if( d
84f0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26  b->autoCommit &&
8500: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
8510: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  nt==1 ){.    if(
8520: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
8530: 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
8540: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
8550: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
8560: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
8570: 20 74 72 75 65 2c 20 74 68 65 72 65 20 61 72 65   true, there are
8580: 20 6e 6f 20 6f 74 68 65 72 20 61 63 74 69 76 65   no other active
8590: 20 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a   queries.      *
85a0: 2a 20 75 73 69 6e 67 20 74 68 69 73 20 68 61 6e  * using this han
85b0: 64 6c 65 20 61 6e 64 20 74 68 65 20 76 64 62 65  dle and the vdbe
85c0: 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
85d0: 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61  cessful or hit a
85e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 27 4f 52 20 46  n.      ** 'OR F
85f0: 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e  AIL' constraint.
8600: 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
8610: 6d 6d 69 74 20 69 73 20 72 65 71 75 69 72 65 64  mmit is required
8620: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8630: 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f   int rc = vdbeCo
8640: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  mmit(db);.      
8650: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
8660: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  USY ){.        r
8670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
8680: 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  Y;.      }else i
8690: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
86a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
86b0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
86c0: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
86d0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  treeRollback;.  
86e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
86f0: 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73  .      xFunc = s
8700: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
8710: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ack;.    }.  }el
8720: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  se{.    if( p->r
8730: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
8740: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
8750: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
8760: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
8770: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b  BtreeCommitStmt;
8780: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8790: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
87a0: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
87b0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
87c0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
87d0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
87e0: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
87f0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
8800: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f  ;.      db->auto
8810: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
8820: 20 20 61 62 6f 72 74 4f 74 68 65 72 41 63 74 69    abortOtherActi
8830: 76 65 56 64 62 65 73 28 70 29 3b 0a 20 20 20 20  veVdbes(p);.    
8840: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 78  }.  }..  /* If x
8850: 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Func is not NULL
8860: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65  , then it is one
8870: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
8880: 52 6f 6c 6c 62 61 63 6b 2c 0a 20 20 2a 2a 20 73  Rollback,.  ** s
8890: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
88a0: 61 63 6b 53 74 6d 74 20 6f 72 20 73 71 6c 69 74  ackStmt or sqlit
88b0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
88c0: 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20  t. Call it once 
88d0: 6f 6e 0a 20 20 2a 2a 20 65 61 63 68 20 62 61 63  on.  ** each bac
88e0: 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  kend. If an erro
88f0: 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  r occurs and the
8900: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
8910: 73 74 69 6c 6c 0a 20 20 2a 2a 20 53 51 4c 49 54  still.  ** SQLIT
8920: 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65  E_OK, set the re
8930: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65  turn code to the
8940: 20 6e 65 77 20 65 72 72 6f 72 20 76 61 6c 75 65   new error value
8950: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
8960: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
8970: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
8980: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
8990: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
89a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
89b0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 72  ( pBt ){.      r
89c0: 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a  c = xFunc(pBt);.
89d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
89e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
89f0: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
8a00: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
8a10: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
8a20: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
8a30: 2c 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65  , set the change
8a40: 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 69   counter. */.  i
8a50: 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
8a60: 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  n && p->pc>=0 ){
8a70: 0a 20 20 20 20 69 66 28 20 21 78 46 75 6e 63 20  .    if( !xFunc 
8a80: 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65  || xFunc==sqlite
8a90: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
8aa0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8ab0: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
8ac0: 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
8ad0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8af0: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
8b00: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 68      }.    p->nCh
8b10: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ange = 0;.  }.. 
8b20: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20   /* Rollback or 
8b30: 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d  commit any schem
8b40: 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f  a changes that o
8b50: 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 69 66  ccurred. */.  if
8b60: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
8b70: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
8b80: 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  3RollbackInterna
8b90: 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
8ba0: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c  }else if( db->fl
8bb0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
8bc0: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
8bd0: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
8be0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
8bf0: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  b);.  }..  /* We
8c00: 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
8c10: 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
8c20: 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
8c30: 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
8c40: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
8c50: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74  0 ){.    db->act
8c60: 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iveVdbeCnt--;.  
8c70: 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
8c80: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
8c90: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
8ca0: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74  eCnt(db);..  ret
8cb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8cc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
8cd0: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
8ce0: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
8cf0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
8d00: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
8d10: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
8d20: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
8d30: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
8d40: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
8d50: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
8d60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
8d70: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
8d80: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
8d90: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
8da0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
8db0: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
8dc0: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
8dd0: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
8de0: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
8df0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
8e00: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
8e10: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
8e20: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
8e30: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
8e40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
8e50: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
8e60: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  ){.  if( p->magi
8e70: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
8e80: 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56  N && p->magic!=V
8e90: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
8ea0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8eb0: 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  or(p->db, SQLITE
8ec0: 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20  _MISUSE, 0);.   
8ed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
8ee0: 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ISUSE;.  }..  /*
8ef0: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
8f00: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
8f10: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
8f20: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
8f30: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
8f40: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
8f50: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
8f60: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
8f70: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
8f80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
8f90: 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
8fa0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
8fb0: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
8fc0: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
8fd0: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
8fe0: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
8ff0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
9000: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
9010: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
9020: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
9030: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
9040: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
9050: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
9060: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
9070: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
9080: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
9090: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
90a0: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
90b0: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
90c0: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
90d0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
90e0: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
90f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9100: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
9110: 63 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 45 72 72  c, "%s", p->zErr
9120: 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
9130: 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  teFree(p->zErrMs
9140: 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  g);.      p->zEr
9150: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
9160: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
9170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9180: 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63  ror(p->db, p->rc
9190: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
91a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
91b0: 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  ror(p->db, SQLIT
91c0: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E_OK, 0);.    }.
91d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
91e0: 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
91f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
9200: 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
9210: 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
9220: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
9230: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
9240: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
9250: 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
9260: 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
9270: 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
9280: 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
9290: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
92a0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
92b0: 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
92c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d   sqlite3Error(p-
92d0: 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  >db, p->rc, 0);.
92e0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
92f0: 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
9300: 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
9310: 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
9320: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
9330: 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
9340: 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
9350: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   run..  */.  ass
9360: 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d  ert( p->pTos<&p-
9370: 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f  >aStack[p->pc<0?
9380: 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 73 71 6c 69  0:p->pc] || sqli
9390: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
93a0: 64 3d 3d 31 20 29 3b 0a 23 69 66 64 65 66 20 56  d==1 );.#ifdef V
93b0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
93c0: 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
93d0: 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
93e0: 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
93f0: 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
9400: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9410: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
9420: 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
9430: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
9440: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9450: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
9460: 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
9470: 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
9480: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
9490: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
94a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
94b0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
94c0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
94d0: 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
94e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
94f0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
9500: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
9510: 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
9520: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
9530: 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
9540: 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
9550: 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
9560: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
9570: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
9580: 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
9590: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
95a0: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
95b0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
95c0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
95d0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
95e0: 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b   p->aborted = 0;
95f0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9600: 4c 49 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20  LITE_SCHEMA ){. 
9610: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
9620: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 70 2d  nternalSchema(p-
9630: 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  >db, 0);.  }.  r
9640: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 20  eturn p->rc;.}. 
9650: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
9660: 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
9670: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
9680: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
9690: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
96a0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
96b0: 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
96c0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
96d0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
96e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
96f0: 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
9700: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
9710: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
9720: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
9730: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
9740: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9750: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
9760: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
9770: 52 65 73 65 74 28 70 29 3b 0a 20 20 7d 65 6c 73  Reset(p);.  }els
9780: 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d  e if( p->magic!=
9790: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
97a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
97b0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
97c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
97d0: 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
97e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
97f0: 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74  all the destruct
9800: 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64  or for each auxd
9810: 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64  ata entry in pVd
9820: 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68  beFunc for which
9830: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
9840: 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73  nding bit in mas
9850: 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78  k is clear.  Aux
9860: 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79  data entries bey
9870: 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c  ond 31.** are al
9880: 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20  ways destroyed. 
9890: 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20   To destroy all 
98a0: 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c  auxdata entries,
98b0: 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f   call this.** ro
98c0: 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d  utine with mask=
98d0: 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =0..*/.void sqli
98e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
98f0: 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70  Data(VdbeFunc *p
9900: 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61  VdbeFunc, int ma
9910: 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sk){.  int i;.  
9920: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65  for(i=0; i<pVdbe
9930: 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29  Func->nAux; i++)
9940: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78  {.    struct Aux
9950: 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56  Data *pAux = &pV
9960: 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69  dbeFunc->apAux[i
9970: 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31  ];.    if( (i>31
9980: 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69   || !(mask&(1<<i
9990: 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75  ))) && pAux->pAu
99a0: 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  x ){.      if( p
99b0: 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
99c0: 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
99d0: 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
99e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
99f0: 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b   pAux->pAux = 0;
9a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9a10: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
9a20: 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
9a30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
9a40: 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
9a50: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
9a60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43  =0 ) return;.  C
9a70: 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66 28  leanup(p);.  if(
9a80: 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
9a90: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
9aa0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
9ab0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9ac0: 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d  ( p->db->pVdbe==
9ad0: 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e  p );.    p->db->
9ae0: 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
9af0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
9b00: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
9b10: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
9b20: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
9b30: 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  ( p->aOp ){.    
9b40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
9b50: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4f  p; i++){.      O
9b60: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
9b70: 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72 65 65 50  [i];.      freeP
9b80: 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70  3(pOp->p3type, p
9b90: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7d 0a 20  Op->p3);.    }. 
9ba0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
9bb0: 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  >aOp);.  }.  rel
9bc0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
9bd0: 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
9be0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
9bf0: 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
9c00: 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29  eFree(p->aStack)
9c10: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
9c20: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
9c30: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 32   p->nResColumn*2
9c40: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
9c50: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
9c60: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
9c70: 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71  MAGIC_DEAD;.  sq
9c80: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
9c90: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
9ca0: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
9cb0: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
9cc0: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
9cd0: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
9ce0: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
9cf0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
9d00: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
9d10: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
9d20: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
9d30: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
9d40: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
9d50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
9d60: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
9d70: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
9d80: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
9d90: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
9da0: 72 63 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  rc;.    extern i
9db0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
9dc0: 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61 73 73  h_count;.    ass
9dd0: 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
9de0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  );.    if( p->is
9df0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  Table ){.      r
9e00: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9e10: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
9e20: 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
9e30: 61 72 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20  arget, &res);.  
9e40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
9e50: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9e60: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
9e70: 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76  r,(char*)&p->mov
9e80: 65 74 6f 54 61 72 67 65 74 2c 0a 20 20 20 20 20  etoTarget,.     
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
9eb0: 69 36 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20  i64),&res);.    
9ec0: 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
9ed0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70  eturn rc;.    *p
9ee0: 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a  ->pIncrKey = 0;.
9ef0: 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64      p->lastRowid
9f00: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d   = keyToInt(p->m
9f10: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20  ovetoTarget);.  
9f20: 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69    p->rowidIsVali
9f30: 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20  d = res==0;.    
9f40: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
9f50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
9f60: 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72  treeNext(p->pCur
9f70: 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
9f80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9f90: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
9fa0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
9fb0: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64  ount++;.    p->d
9fc0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
9fd0: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 56  0;.    p->cacheV
9fe0: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  alid = 0;.  }.  
9ff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
a010: 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
a020: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
a030: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
a040: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
a050: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
a060: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
a070: 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71  rialRead().** sq
a080: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
a090: 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
a0a0: 64 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29  dbeSerialWrite()
a0b0: 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
a0c0: 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
a0d0: 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
a0e0: 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
a0f0: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
a100: 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
a110: 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
a120: 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
a130: 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
a140: 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
a150: 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
a160: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
a170: 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
a180: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
a190: 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
a1a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
a1b0: 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
a1c0: 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
a1d0: 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
a1e0: 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
a1f0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
a200: 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
a210: 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
a220: 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
a230: 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
a240: 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
a250: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
a260: 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
a270: 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
a280: 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
a290: 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
a2a0: 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
a2b0: 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
a2c0: 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
a2d0: 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
a2e0: 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
a2f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
a300: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
a310: 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
a320: 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
a330: 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
a340: 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
a350: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
a360: 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
a390: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
a3a0: 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
a3d0: 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
a400: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
a410: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
a420: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
a430: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
a440: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
a470: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
a480: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
a4b0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
a4c0: 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
a4d0: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
a4e0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
a4f0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
a520: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
a530: 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
a550: 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
a560: 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 38 2d 31 31  loat.**     8-11
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a590: 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
a5a0: 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
a5b0: 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
a5c0: 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
a5d0: 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
a5e0: 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
a5f0: 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
a600: 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a    text.**.*/../*
a610: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
a620: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
a630: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
a640: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
a650: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
a660: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29  lType(Mem *pMem)
a670: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
a680: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20  pMem->flags;..  
a690: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
a6a0: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
a6b0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
a6c0: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
a6d0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
a6e0: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
a6f0: 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
a700: 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
a710: 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
a720: 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30  (((i64)0x0000100
a730: 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
a740: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a  64 i = pMem->i;.
a750: 20 20 20 20 75 36 34 20 75 20 3d 20 69 3c 30 20      u64 u = i<0 
a760: 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66  ? -i : i;.    if
a770: 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
a780: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
a790: 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
a7a0: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
a7b0: 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
a7c0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
a7d0: 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
a7e0: 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
a7f0: 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
a800: 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
a810: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
a820: 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
a830: 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
a840: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
a850: 53 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Str ){.    int n
a860: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
a870: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
a880: 20 20 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32      return ((n*2
a890: 29 20 2b 20 31 33 29 3b 0a 20 20 7d 0a 20 20 69  ) + 13);.  }.  i
a8a0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  f( flags&MEM_Blo
a8b0: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
a8c0: 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 32 29  (pMem->n*2 + 12)
a8d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
a8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a8f0: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
a900: 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
a910: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
a920: 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
a930: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
a940: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
a950: 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
a960: 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
a970: 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
a980: 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
a990: 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
a9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
a9b0: 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
a9c0: 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
a9d0: 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
a9e0: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
a9f0: 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
aa00: 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
aa10: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  }../*.** Write t
aa20: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
aa30: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
aa40: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
aa50: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
aa60: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
aa70: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
aa80: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
aa90: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
aaa0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
aab0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
aac0: 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69 6e 74 20  ritten..*/ .int 
aad0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
aae0: 6c 50 75 74 28 75 6e 73 69 67 6e 65 64 20 63 68  lPut(unsigned ch
aaf0: 61 72 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d  ar *buf, Mem *pM
ab00: 65 6d 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  em){.  u32 seria
ab10: 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
ab20: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
ab30: 4d 65 6d 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Mem);.  int len;
ab40: 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20  ..  /* NULL */. 
ab50: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
ab60: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ab70: 6e 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  n 0;.  }. .  /* 
ab80: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
ab90: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
aba0: 5f 74 79 70 65 3c 3d 37 20 29 7b 0a 20 20 20 20  _type<=7 ){.    
abb0: 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69  u64 v;.    int i
abc0: 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
abd0: 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
abe0: 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d    v = *(u64*)&pM
abf0: 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  em->r;.    }else
ac00: 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75 36  {.      v = *(u6
ac10: 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20  4*)&pMem->i;.   
ac20: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
ac30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
ac40: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
ac50: 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c  _type);.    whil
ac60: 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
ac70: 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46  buf[i] = (v&0xFF
ac80: 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
ac90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
aca0: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 0a 20  rn len;.  }.  . 
acb0: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
acc0: 6f 62 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ob */.  assert( 
acd0: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
ace0: 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  );.  len = sqlit
acf0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
ad00: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
ad10: 3b 0a 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  ;.  memcpy(buf, 
ad20: 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
ad30: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a   return len;.}..
ad40: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
ad50: 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
ad60: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
ad70: 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
ad80: 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
ad90: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
ada0: 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
adb0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
adc0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
add0: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
ade0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
adf0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
ae00: 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
ae10: 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
ae20: 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
ae30: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
ae40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae50: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
ae60: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
ae70: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
aea0: 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
aeb0: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
aec0: 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
aed0: 7b 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  {.    case 8:   
aee0: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
aef0: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
af00: 20 20 20 63 61 73 65 20 39 3a 20 20 20 20 2f 2a     case 9:    /*
af10: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
af20: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
af30: 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
af40: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
af50: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
af60: 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
af70: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
af80: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
af90: 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
afa0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
afb0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
afc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
afd0: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
afe0: 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
aff0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
b000: 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 73 69 67 6e   pMem->i = (sign
b010: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
b020: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b030: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
b040: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b050: 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
b060: 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
b070: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
b080: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 28 28     pMem->i = (((
b090: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
b0a0: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
b0b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
b0c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
b0d0: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
b0e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
b0f0: 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
b100: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
b110: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28       pMem->i = (
b120: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
b130: 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
b140: 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
b150: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
b160: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
b170: 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
b180: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
b190: 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
b1a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
b1b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
b1c0: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
b1d0: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
b1e0: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
b1f0: 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
b200: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
b210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
b220: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b230: 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
b240: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
b250: 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
b260: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
b270: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
b280: 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
b290: 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
b2a0: 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
b2b0: 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
b2c0: 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
b2d0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
b2e0: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a 28 69     pMem->i = *(i
b2f0: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
b300: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b310: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
b320: 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
b330: 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
b340: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
b350: 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
b360: 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
b370: 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
b380: 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
b390: 75 33 32 20 79 3b 0a 23 69 66 6e 64 65 66 20 4e  u32 y;.#ifndef N
b3a0: 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 56  DEBUG.      /* V
b3b0: 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
b3c0: 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
b3d0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
b3e0: 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
b3f0: 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
b400: 20 54 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   The byte order 
b410: 64 69 66 66 65 72 73 20 6f 6e 20 73 6f 6d 65 20  differs on some 
b420: 28 62 72 6f 6b 65 6e 29 20 61 72 63 68 69 74 65  (broken) archite
b430: 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20 2a 2f  ctures..      */
b440: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
b450: 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
b460: 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
b470: 33 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  32;.      assert
b480: 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62 6c 65 2a  ( 1.0==*(double*
b490: 29 26 74 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  )&t1 );.#endif..
b4a0: 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30        x = (buf[0
b4b0: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
b4c0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
b4d0: 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
b4e0: 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c      y = (buf[4]<
b4f0: 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c  <24) | (buf[5]<<
b500: 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38  16) | (buf[6]<<8
b510: 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20  ) | buf[7];.    
b520: 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
b530: 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  y;.      if( ser
b540: 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
b550: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d         pMem->i =
b560: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
b570: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
b580: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
b590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b5a0: 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f 75 62  pMem->r = *(doub
b5b0: 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  le*)&x;.        
b5c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b5d0: 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
b5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
b5f0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
b600: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  t: {.      int l
b610: 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
b620: 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
b630: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
b640: 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
b650: 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
b660: 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
b670: 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
b680: 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
b690: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
b6a0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
b6b0: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
b6c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
b6d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
b6e0: 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
b6f0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
b700: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
b710: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b720: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
b730: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
b740: 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
b750: 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
b760: 65 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 64  ecords specified
b770: 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20   by .** {nKey1, 
b780: 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79  pKey1} and {nKey
b790: 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72  2, pKey2}, retur
b7a0: 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c  ning a negative,
b7b0: 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
b7c0: 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
b7d0: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69  {nKey1, pKey1} i
b7e0: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
b7f0: 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
b800: 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32  ater than {nKey2
b810: 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20  , pKey2}.  Both 
b820: 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75  Key1 and Key2 mu
b830: 73 74 20 62 65 20 62 79 74 65 20 73 74 72 69 6e  st be byte strin
b840: 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62  gs.** composed b
b850: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
b860: 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
b870: 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73  e VDBE..*/.int s
b880: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
b890: 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
b8a0: 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74  *userData,.  int
b8b0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
b8c0: 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e  id *pKey1, .  in
b8d0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
b8e0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
b8f0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
b900: 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73  o = (KeyInfo*)us
b910: 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31  erData;.  u32 d1
b920: 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f  , d2;          /
b930: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
b940: 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
b950: 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
b960: 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20  32 idx1, idx2;  
b970: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
b980: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
b990: 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
b9a0: 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
b9b0: 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75  , szHdr2;  /* Nu
b9c0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
b9d0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
b9e0: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
b9f0: 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
ba00: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
ba10: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
ba20: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
ba30: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
ba40: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
ba50: 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20  d char *aKey2 = 
ba60: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
ba70: 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20  char *)pKey2;.. 
ba80: 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d   Mem mem1;.  Mem
ba90: 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e   mem2;.  mem1.en
baa0: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
bab0: 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20  c;.  mem2.enc = 
bac0: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
bad0: 20 0a 20 20 69 64 78 31 20 3d 20 73 71 6c 69 74   .  idx1 = sqlit
bae0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b  e3GetVarint32(pK
baf0: 65 79 31 2c 20 26 73 7a 48 64 72 31 29 3b 0a 20  ey1, &szHdr1);. 
bb00: 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
bb10: 69 64 78 32 20 3d 20 73 71 6c 69 74 65 33 47 65  idx2 = sqlite3Ge
bb20: 74 56 61 72 69 6e 74 33 32 28 70 4b 65 79 32 2c  tVarint32(pKey2,
bb30: 20 26 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20   &szHdr2);.  d2 
bb40: 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65  = szHdr2;.  nFie
bb50: 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
bb60: 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
bb70: 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
bb80: 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20  dx2<szHdr2 ){.  
bb90: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
bba0: 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69  e1;.    u32 seri
bbb0: 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f  al_type2;..    /
bbc0: 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
bbd0: 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
bbe0: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
bbf0: 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
bc00: 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
bc10: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  GetVarint32(&aKe
bc20: 79 31 5b 69 64 78 31 5d 2c 20 26 73 65 72 69 61  y1[idx1], &seria
bc30: 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20 69 66  l_type1);.    if
bc40: 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
bc50: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
bc60: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
bc70: 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
bc80: 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 73 71 6c  .    idx2 += sql
bc90: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
bca0: 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c 20 26 73  &aKey2[idx2], &s
bcb0: 65 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 20 20  erial_type2);.  
bcc0: 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20    if( d2>=nKey2 
bcd0: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
bce0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
bcf0: 61 6c 5f 74 79 70 65 32 29 3e 30 20 29 20 62 72  al_type2)>0 ) br
bd00: 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73  eak;..    /* Ass
bd10: 65 72 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ert that there i
bd20: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  s enough space l
bd30: 65 66 74 20 69 6e 20 65 61 63 68 20 6b 65 79 20  eft in each key 
bd40: 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a  for the blob of.
bd50: 20 20 20 20 2a 2a 20 64 61 74 61 20 74 6f 20 67      ** data to g
bd60: 6f 20 77 69 74 68 20 74 68 65 20 73 65 72 69 61  o with the seria
bd70: 6c 20 74 79 70 65 20 6a 75 73 74 20 72 65 61 64  l type just read
bd80: 2e 20 54 68 69 73 20 61 73 73 65 72 74 20 6d 61  . This assert ma
bd90: 79 20 66 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a  y fail if.    **
bda0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
bdb0: 72 75 70 74 65 64 2e 20 20 54 68 65 6e 20 72 65  rupted.  Then re
bdc0: 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ad the value fro
bdd0: 6d 20 65 61 63 68 20 6b 65 79 20 69 6e 74 6f 20  m each key into 
bde0: 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20  mem1.    ** and 
bdf0: 6d 65 6d 32 20 72 65 73 70 65 63 74 69 76 65 6c  mem2 respectivel
be00: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  y..    */.    d1
be10: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
be20: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
be30: 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
be40: 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 64  1, &mem1);.    d
be50: 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  2 += sqlite3Vdbe
be60: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 32  SerialGet(&aKey2
be70: 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d2], serial_typ
be80: 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20  e2, &mem2);..   
be90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
bea0: 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
beb0: 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20 3f  mem2, i<nField ?
bec0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
bed0: 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
bee0: 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d  ( mem1.flags & M
bef0: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
bf00: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
bf10: 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20 6d  mem1);.    if( m
bf20: 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em2.flags & MEM_
bf30: 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  Dyn ) sqlite3Vdb
bf40: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
bf50: 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  2);.    if( rc!=
bf60: 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
bf70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
bf80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f  .  }..  /* One o
bf90: 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
bfa0: 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62 75  ut of fields, bu
bfb0: 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  t all the fields
bfc0: 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
bfd0: 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75 61  t.  ** were equa
bfe0: 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b 65  l. If the incrKe
bff0: 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  y flag is true, 
c000: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  then the second 
c010: 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65 61  key is.  ** trea
c020: 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a 20  ted as larger.. 
c030: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20   */.  if( rc==0 
c040: 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  ){.    if( pKeyI
c050: 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a  nfo->incrKey ){.
c060: 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
c070: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 31 3c     }else if( d1<
c080: 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 72  nKey1 ){.      r
c090: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
c0a0: 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b   if( d2<nKey2 ){
c0b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
c0c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
c0d0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
c0e0: 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49  Order && i<pKeyI
c0f0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 26 26 20 70  nfo->nField && p
c100: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
c110: 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
c120: 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
c130: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c140: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
c150: 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  is an index entr
c160: 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67  y composed using
c170: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
c180: 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68  rd opcode..** Th
c190: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
c1a0: 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75  this record shou
c1b0: 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
c1c0: 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a   (specifically.*
c1d0: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77  * an integer row
c1e0: 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  id).  This routi
c1f0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
c200: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
c210: 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65  n.** that intege
c220: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
c230: 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
c240: 28 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74  (int nKey, const
c250: 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
c260: 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
c270: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
c280: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
c290: 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
c2a0: 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
c2b0: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73  he rowid */..  s
c2c0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
c2d0: 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b  2(aKey, &szHdr);
c2e0: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
c2f0: 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64  int32(&aKey[szHd
c300: 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
c310: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
c320: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
c330: 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
c340: 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  .}.  ../*.** pCu
c350: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
c360: 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
c370: 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
c380: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
c390: 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
c3a0: 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
c3b0: 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
c3c0: 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
c3d0: 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
c3e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c3f0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
c400: 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
c410: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
c420: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c430: 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75  dbeIdxRowid(BtCu
c440: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
c450: 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
c460: 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72  CellKey;.  int r
c470: 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
c480: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c490: 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
c4a0: 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
c4b0: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
c4c0: 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
c4d0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
c4e0: 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
c4f0: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
c500: 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71   Mem m, v;..  sq
c510: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
c520: 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
c530: 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
c540: 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey<=0 ){.    ret
c550: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c560: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
c570: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
c580: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
c590: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
c5a0: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
c5b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
c5c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47  ;.  }.  sqlite3G
c5d0: 65 74 56 61 72 69 6e 74 33 32 28 6d 2e 7a 2c 20  etVarint32(m.z, 
c5e0: 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74  &szHdr);.  sqlit
c5f0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 6d  e3GetVarint32(&m
c600: 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79  .z[szHdr-1], &ty
c610: 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52  peRowid);.  lenR
c620: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
c630: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
c640: 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71  typeRowid);.  sq
c650: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
c660: 65 74 28 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  et(&m.z[m.n-lenR
c670: 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
c680: 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
c690: 3d 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  = v.i;.  sqlite3
c6a0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
c6b0: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
c6c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c6d0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
c6e0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
c6f0: 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
c700: 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
c710: 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
c720: 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
c730: 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
c740: 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
c750: 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
c760: 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
c770: 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
c780: 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
c790: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
c7a0: 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
c7b0: 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
c7c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
c7d0: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
c7e0: 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
c7f0: 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
c800: 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
c810: 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
c820: 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
c830: 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
c840: 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
c850: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
c860: 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
c870: 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
c880: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c890: 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
c8a0: 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20  (.  Cursor *pC, 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
c8d0: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
c8e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
c8f0: 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20  const u8 *pKey, 
c900: 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20    /* The key to 
c910: 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74  compare */.  int
c920: 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
c930: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
c940: 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
c950: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
c960: 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
c970: 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  y;.  int rc;.  B
c980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
c990: 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  pC->pCursor;.  i
c9a0: 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d  nt lenRowid;.  M
c9b0: 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  em m;..  sqlite3
c9c0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
c9d0: 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
c9e0: 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
c9f0: 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
ca00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ca10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
ca20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
ca30: 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
ca40: 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c  Cursor, 0, nCell
ca50: 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
ca60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
ca70: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65  urn rc;.  }.  le
ca80: 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
ca90: 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28  VdbeIdxRowidLen(
caa0: 6d 2e 6e 2c 20 6d 2e 7a 29 3b 0a 20 20 2a 72 65  m.n, m.z);.  *re
cab0: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
cac0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70 43 2d  ecordCompare(pC-
cad0: 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c  >pKeyInfo, m.n-l
cae0: 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b  enRowid, m.z, nK
caf0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c  ey, pKey);.  sql
cb00: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
cb10: 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
cb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
cb30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cb40: 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
cb50: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
cb60: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
cb70: 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
cb80: 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
cb90: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
cba0: 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
cbb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
cbc0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
cbd0: 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
cbe0: 29 7b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  ){.  db->nChange
cbf0: 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
cc00: 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
cc10: 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
cc20: 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
cc30: 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
cc40: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
cc50: 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
cc60: 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
cc70: 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
cc80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
cc90: 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
cca0: 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
ccb0: 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
ccc0: 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
ccd0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
cce0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ccf0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
cd00: 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
cd10: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
cd20: 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
cd30: 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
cd40: 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
cd50: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
cd60: 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
cd70: 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
cd80: 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
cd90: 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
cda0: 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
cdb0: 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
cdc0: 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
cdd0: 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
cde0: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
cdf0: 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
ce00: 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
ce10: 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
ce20: 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
ce30: 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
ce40: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ce50: 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
ce60: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
ce70: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
ce80: 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
ce90: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
cea0: 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
ceb0: 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
cec0: 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
ced0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
cee0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
cef0: 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
cf00: 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
cf10: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
cf20: 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
cf30: 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
cf40: 2d 3e 64 62 3b 0a 7d 0a                          ->db;.}.