/ Hex Artifact Content
Login

Artifact 8fd4f36dba8729fabe7ed6b2a2c1b05b7bf96ebe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03d0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03e0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
0400: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0410: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0420: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0430: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0440: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0450: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0470: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
0480: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
0490: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04b0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04c0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
04d0: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
04e0: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
04f0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0500: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0510: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0520: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0530: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn p;.}../*.** T
0540: 75 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  urn tracing on o
0550: 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71  r off.*/.void sq
0560: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 56  lite3VdbeTrace(V
0570: 64 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72  dbe *p, FILE *tr
0580: 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65  ace){.  p->trace
0590: 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a   = trace;.}../*.
05a0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
05b0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
05c0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
05d0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
05e0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
05f0: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0600: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0610: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0620: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0630: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0640: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 20 0a  tain exactly N .
0650: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** elements..*/.
0660: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 69  static void resi
0670: 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  zeOpArray(Vdbe *
0680: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  p, int N){.  int
0690: 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d 61   runMode = p->ma
06a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
06b0: 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d 6f  RUN;.  if( runMo
06c0: 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  de || p->nOpAllo
06d0: 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  c<N ){.    VdbeO
06e0: 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  p *pNew;.    int
06f0: 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30 2a   nNew = N + 100*
0700: 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  (!runMode);.    
0710: 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d  int oldSize = p-
0720: 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  >nOpAlloc;.    p
0730: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0740: 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77  loc(p->aOp, nNew
0750: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0760: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0770: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0780: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d  = nNew;.      p-
0790: 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20  >aOp = pNew;.   
07a0: 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f 6c 64 53     if( nNew>oldS
07b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ize ){.        m
07c0: 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c  emset(&p->aOp[ol
07d0: 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e 4e 65 77  dSize], 0, (nNew
07e0: 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66  -oldSize)*sizeof
07f0: 28 4f 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (Op));.      }. 
0800: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0810: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0820: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0830: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0840: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0850: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0860: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0870: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0880: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0890: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
08a0: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
08b0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
08c0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
08d0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
08e0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
08f0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0900: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 20  **.**    p1, p2 
0910: 20 20 20 20 20 20 20 20 20 46 69 72 73 74 20 74           First t
0920: 77 6f 20 6f 66 20 74 68 65 20 74 68 72 65 65 20  wo of the three 
0930: 70 6f 73 73 69 62 6c 65 20 6f 70 65 72 61 6e 64  possible operand
0940: 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  s..**.** Use the
0950: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
0960: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
0970: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
0980: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
0990: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
09a0: 67 65 50 33 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP3() function 
09b0: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
09c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a  lue of the P3.**
09d0: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
09e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
09f0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  p(Vdbe *p, int o
0a00: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0a10: 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  2){.  int i;.  V
0a20: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69  dbeOp *pOp;..  i
0a30: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
0a40: 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  nOp++;.  assert(
0a50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0a60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0a70: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
0a80: 20 69 2b 31 29 3b 0a 20 20 69 66 28 20 73 71 6c   i+1);.  if( sql
0a90: 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
0aa0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
0ab0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
0ac0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
0ad0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
0ae0: 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d   op;.  pOp->p1 =
0af0: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
0b00: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
0b10: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 33 74 79 70   0;.  pOp->p3typ
0b20: 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a  e = P3_NOTUSED;.
0b30: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
0b40: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0b50: 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69  DEBUG.  if( sqli
0b60: 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
0b70: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0b80: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0b90: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0ba0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
0bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
0bc0: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
0bd0: 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c 75  udes the p3 valu
0be0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
0bf0: 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a 70  3VdbeOp3(Vdbe *p
0c00: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0c10: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
0c20: 63 68 61 72 20 2a 7a 50 33 2c 69 6e 74 20 70 33  char *zP3,int p3
0c30: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  type){.  int add
0c40: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
0c50: 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31 2c 20  ddOp(p, op, p1, 
0c60: 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2);.  sqlite3Vd
0c70: 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 61 64  beChangeP3(p, ad
0c80: 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70 65 29  dr, zP3, p3type)
0c90: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
0ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
0cb0: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
0cc0: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
0cd0: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
0ce0: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
0cf0: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
0d00: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
0d10: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
0d20: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
0d30: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
0d40: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
0d50: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
0d60: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
0d70: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
0d80: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
0d90: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
0da0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
0db0: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
0dc0: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
0dd0: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
0de0: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
0df0: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
0e00: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
0e10: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
0e20: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
0e30: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
0e40: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
0e50: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
0e60: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
0e70: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
0e80: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
0e90: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
0ea0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
0eb0: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
0ec0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
0ed0: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
0ee0: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
0ef0: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
0f00: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
0f10: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  c() fails..*/.in
0f20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
0f30: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b  eLabel(Vdbe *p){
0f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
0f50: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
0f60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
0f70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
0f80: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
0f90: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20  nLabelAlloc ){. 
0fa0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
0fb0: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
0fc0: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 73  oc*2 + 10;.    s
0fd0: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46  qlite3ReallocOrF
0fe0: 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 2d 3e  ree((void**)&p->
0ff0: 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  aLabel,.        
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
1020: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
1030: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
1040: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
1050: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1060: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1070: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1080: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1090: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
10a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
10b0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
10c0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
10d0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
10e0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
10f0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1100: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
1110: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
1120: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
1130: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1140: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
1150: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
1160: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1170: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1180: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
11a0: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
11b0: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
11c0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
11d0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
11e0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
11f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1200: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
1210: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
1220: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
1230: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
1240: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
1250: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
1260: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1270: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1280: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1290: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
12a0: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
12b0: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
12c0: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
12d0: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
12e0: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
12f0: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
1300: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
1310: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
1320: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
1330: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
1340: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
1350: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
1360: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1370: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1380: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1390: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
13a0: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
13b0: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
13c0: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
13d0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
13e0: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
13f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
1400: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
1410: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
1420: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
1430: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
1440: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
1450: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
1460: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1470: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1480: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1490: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
14a0: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
14b0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
14c0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
14d0: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
14e0: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
14f0: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1500: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
1510: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
1520: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
1530: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
1540: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
1550: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
1560: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1570: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1580: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1590: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
15a0: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
15b0: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
15c0: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
15d0: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
15e0: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
15f0: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1600: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1610: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1620: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1630: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1640: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1650: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1660: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1670: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1680: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1690: 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 31 3c   (NOPUSH_MASK_1<
16a0: 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48  <16),.    NOPUSH
16b0: 5f 4d 41 53 4b 5f 32 20 2b 20 28 4e 4f 50 55 53  _MASK_2 + (NOPUS
16c0: 48 5f 4d 41 53 4b 5f 33 3c 3c 31 36 29 2c 0a 20  H_MASK_3<<16),. 
16d0: 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 34     NOPUSH_MASK_4
16e0: 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f   + (NOPUSH_MASK_
16f0: 35 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55  5<<16),.    NOPU
1700: 53 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 4e 4f 50  SH_MASK_6 + (NOP
1710: 55 53 48 5f 4d 41 53 4b 5f 37 3c 3c 31 36 29 2c  USH_MASK_7<<16),
1720: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1730: 5f 38 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53  _8 + (NOPUSH_MAS
1740: 4b 5f 39 3c 3c 31 36 29 0a 20 20 7d 3b 0a 20 20  K_9<<16).  };.  
1750: 61 73 73 65 72 74 28 20 6f 70 3c 33 32 2a 35 20  assert( op<32*5 
1760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73  );.  return (mas
1770: 6b 73 5b 6f 70 3e 3e 35 5d 20 26 20 28 31 3c 3c  ks[op>>5] & (1<<
1780: 28 6f 70 26 30 78 31 46 29 29 29 3b 0a 7d 0a 0a  (op&0x1F)));.}..
1790: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
17a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  nt sqlite3VdbeOp
17b0: 63 6f 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70  codeNoPush(u8 op
17c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 63 6f  ){.  return opco
17d0: 64 65 4e 6f 50 75 73 68 28 6f 70 29 3b 0a 7d 0a  deNoPush(op);.}.
17e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
17f0: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  op through the p
1800: 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66  rogram looking f
1810: 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61  or P2 values tha
1820: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
1830: 2a 2a 20 45 61 63 68 20 73 75 63 68 20 76 61 6c  ** Each such val
1840: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20  ue is a label.  
1850: 52 65 73 6f 6c 76 65 20 74 68 65 20 6c 61 62 65  Resolve the labe
1860: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
1870: 20 50 32 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20   P2.** value to 
1880: 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d  its correct non-
1890: 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  zero value..**.*
18a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18b0: 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66  s called once af
18c0: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
18d0: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
18e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ed..**.** Variab
18f0: 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  le *pMaxFuncArgs
1900: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d   is set to the m
1910: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  aximum value of 
1920: 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20  any P2 argument 
1930: 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e  .** to an OP_Fun
1940: 63 74 69 6f 6e 20 6f 72 20 4f 50 5f 41 67 67 53  ction or OP_AggS
1950: 74 65 70 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  tep opcode. This
1960: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
1970: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1980: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
1990: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
19a0: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
19b0: 20 69 6e 74 65 67 65 72 20 2a 70 4d 61 78 53 74   integer *pMaxSt
19c0: 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 74 68  ack is set to th
19d0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
19e0: 20 6f 66 20 76 64 62 65 20 73 74 61 63 6b 0a 2a   of vdbe stack.*
19f0: 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 73  * entries that s
1a00: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 72  tatic analysis r
1a10: 65 76 65 61 6c 73 20 74 68 69 73 20 70 72 6f 67  eveals this prog
1a20: 72 61 6d 20 6d 69 67 68 74 20 6e 65 65 64 2e 0a  ram might need..
1a30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a40: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68 65  ne also does the
1a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6d   following optim
1a60: 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63 61  ization:  It sca
1a70: 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c 74 20 69  ns for.** Halt i
1a80: 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72  nstructions wher
1a90: 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  e P1==SQLITE_CON
1aa0: 53 54 52 41 49 4e 54 20 6f 72 20 50 32 3d 3d 4f  STRAINT or P2==O
1ab0: 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f 72 0a 2a  E_Abort or for.*
1ac0: 2a 20 49 64 78 49 6e 73 65 72 74 20 69 6e 73 74  * IdxInsert inst
1ad0: 72 75 63 74 69 6f 6e 73 20 77 68 65 72 65 20 50  ructions where P
1ae0: 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20 73 75 63  2!=0.  If no suc
1af0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
1b00: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  .** found, then 
1b10: 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74 20  every Statement 
1b20: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 63  instruction is c
1b30: 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f 70  hanged to a Noop
1b40: 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73 20 77 61  .  In.** this wa
1b50: 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65 61  y, we avoid crea
1b60: 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ting the stateme
1b70: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  nt journal file 
1b80: 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e 0a 2a  unnecessarily..*
1b90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1ba0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64  solveP2Values(Vd
1bb0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78  be *p, int *pMax
1bc0: 46 75 6e 63 41 72 67 73 2c 20 69 6e 74 20 2a 70  FuncArgs, int *p
1bd0: 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20 69 6e 74  MaxStack){.  int
1be0: 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72   i;.  int nMaxAr
1bf0: 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4d  gs = 0;.  int nM
1c00: 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e 6e 4f 70  axStack = p->nOp
1c10: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
1c20: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
1c30: 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f  aLabel;.  int do
1c40: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1c50: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ack = 0;.  int h
1c60: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
1c70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 0;.  for(pOp=
1c80: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
1c90: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1ca0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
1cb0: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
1cc0: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
1cd0: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
1ce0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41   || opcode==OP_A
1cf0: 67 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20  ggStep ){.      
1d00: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
1d10: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1d20: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d  = pOp->p2;.    }
1d30: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1d40: 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20  =OP_Halt ){.    
1d50: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53    if( pOp->p1==S
1d60: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1d70: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
1d80: 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
1d90: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1da0: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
1db0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1dc0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ( opcode==OP_Idx
1dd0: 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
1de0: 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a 20  if( pOp->p2 ){. 
1df0: 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65         doesState
1e00: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  mentRollback = 1
1e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e20: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1e30: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  OP_Statement ){.
1e40: 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d 65        hasStateme
1e50: 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20  ntBegin = 1;.   
1e60: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   }..    if( opco
1e70: 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65 29  deNoPush(opcode)
1e80: 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53 74   ){.      nMaxSt
1e90: 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20  ack--;.    }..  
1ea0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d 30    if( pOp->p2>=0
1eb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ec0: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
1ed0: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
1ee0: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61  .    pOp->p2 = a
1ef0: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
1f00: 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  ];.  }.  sqliteF
1f10: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
1f20: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
1f30: 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ..  *pMaxFuncArg
1f40: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
1f50: 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d 61  *pMaxStack = nMa
1f60: 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  xStack;..  /* If
1f70: 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61   we never rollba
1f80: 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ck a statement t
1f90: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1fa0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
1fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1fc0: 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f   not needed.  So
1fd0: 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50   change every OP
1fe0: 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20  _Statement.  ** 
1ff0: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f  opcode into an O
2000: 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76  P_Noop.  This av
2010: 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  oid a call to sq
2020: 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e 45 78 63  lite3Os.xOpenExc
2030: 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68  lusive().  ** wh
2040: 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ich can be expen
2050: 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61  sive on some pla
2060: 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69  tforms..  */.  i
2070: 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  f( hasStatementB
2080: 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61  egin && !doesSta
2090: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29  tementRollback )
20a0: 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d  {.    for(pOp=p-
20b0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
20c0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
20d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
20e0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
20f0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
2100: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2110: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
2120: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2130: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2140: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2150: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2160: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2180: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
2190: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
21a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
21b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
21c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
21d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
21e0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
21f0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
2200: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
2210: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
2220: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
2230: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
2240: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
2250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2260: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
2270: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
2280: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
2290: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
22a0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
22b0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
22c0: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
22d0: 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29 3b  , p->nOp + nOp);
22e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 73  .  if( sqlite3Ts
22f0: 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
2300: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
2310: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
2320: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p->nOp;.  if( nO
2330: 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p>0 ){.    int i
2340: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
2350: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
2360: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
2370: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
2380: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
2390: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
23a0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
23b0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
23c0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
23d0: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
23e0: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
23f0: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
2400: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70      pOut->p2 = p
2410: 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44  2<0 ? addr + ADD
2420: 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20  R(p2) : p2;.    
2430: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
2440: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
2450: 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e  ->p3type = pIn->
2460: 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a  p3 ? P3_STATIC :
2470: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66   P3_NOTUSED;.#if
2480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2490: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
24a0: 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
24b0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
24c0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
24d0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
24e0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
24f0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2500: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2510: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
2520: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2530: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2540: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
2550: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2560: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2570: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2580: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
2590: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
25a0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
25b0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
25c0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
25d0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
25e0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
25f0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2600: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2610: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
2620: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2630: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
2640: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2650: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2660: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2670: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
2680: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2690: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
26a0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
26b0: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
26c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
26d0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
26e0: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
26f0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2700: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2720: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
2730: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
2740: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
2750: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2760: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
2770: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2780: 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d  .  assert( val>=
2790: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27a0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
27b0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
27c0: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
27d0: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
27e0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
27f0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
2800: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2810: 2a 2a 20 43 68 61 6e 67 65 20 74 65 68 20 50 32  ** Change teh P2
2820: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
2830: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
2840: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2850: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
2860: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2870: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
2880: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
2890: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
28a0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
28b0: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
28c0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
28d0: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
28e0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
28f0: 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P3 value if nece
2900: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
2910: 20 76 6f 69 64 20 66 72 65 65 50 33 28 69 6e 74   void freeP3(int
2920: 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p3type, void *p
2930: 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29 7b 0a  3){.  if( p3 ){.
2940: 20 20 20 20 73 77 69 74 63 68 28 20 70 33 74 79      switch( p3ty
2950: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
2960: 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20   P3_DYNAMIC:.   
2970: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
2980: 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  FO:.      case P
2990: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
29a0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  F: {.        sql
29b0: 69 74 65 46 72 65 65 28 70 33 29 3b 0a 20 20 20  iteFree(p3);.   
29c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29d0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
29e0: 33 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  3_VDBEFUNC: {.  
29f0: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
2a00: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
2a10: 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20  eFunc *)p3;.    
2a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
2a30: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64  eleteAuxData(pVd
2a40: 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20  beFunc, 0);.    
2a50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2a60: 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20  VdbeFunc);.     
2a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a80: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
2a90: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MEM: {.        s
2aa0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
2ab0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
2ac0: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
2ad0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2ae0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
2af0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2b00: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
2b10: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2b20: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2b30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2b40: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
2b50: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
2b60: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
2b70: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
2b80: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
2b90: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
2ba0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
2bb0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2bc0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2bd0: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
2be0: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33 20 6f  =0 then the P3 o
2bf0: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
2c00: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
2c10: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
2c20: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
2c30: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
2c40: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2c50: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  Malloc()..** A v
2c60: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
2c70: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
2c80: 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69   zP3 up to and i
2c90: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
2ca0: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
2cb0: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
2cc0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
2cd0: 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP3..**.** If n=
2ce0: 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P3_KEYINFO it m
2cf0: 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73  eans that zP3 is
2d00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2d10: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2d20: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
2d30: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
2d40: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
2d50: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
2d60: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
2d70: 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66  eMalloc, to be f
2d80: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
2d90: 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e  be is finalized.
2da0: 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  .** n==P3_KEYINF
2db0: 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61  O_HANDOFF indica
2dc0: 74 65 73 20 74 68 61 74 20 7a 50 33 20 70 6f 69  tes that zP3 poi
2dd0: 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
2de0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74   structure.** st
2df0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74  ored in memory t
2e00: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
2e10: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2e20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e 20 54   sqliteMalloc. T
2e30: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
2e40: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
2e50: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
2e60: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
2e70: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
2e80: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
2e90: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
2ea0: 73 20 6f 66 20 6e 20 28 50 33 5f 53 54 41 54 49  s of n (P3_STATI
2eb0: 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P3_COLLSEQ et
2ec0: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
2ed0: 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP3 points.** 
2ee0: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
2ef0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
2f00: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2f10: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
2f20: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
2f30: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
2f40: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
2f50: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
2f60: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
2f70: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
2f80: 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  3 on the most re
2f90: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
2fa0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2fb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2fc0: 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70  ChangeP3(Vdbe *p
2fd0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
2fe0: 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74  t char *zP3, int
2ff0: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
3000: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3010: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3020: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
3030: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
3040: 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e  | sqlite3Tsd()->
3050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
3060: 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50 33 5f      if (n != P3_
3070: 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20  KEYINFO) {.     
3080: 20 66 72 65 65 50 33 28 6e 2c 20 28 76 6f 69 64   freeP3(n, (void
3090: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 33 29  *)*(char**)&zP3)
30a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30b0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64  rn;.  }.  if( ad
30c0: 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d  dr<0 || addr>=p-
30d0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64 64 72  >nOp ){.    addr
30e0: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
30f0: 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20     if( addr<0 ) 
3100: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f  return;.  }.  pO
3110: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3120: 5d 3b 0a 20 20 66 72 65 65 50 33 28 70 4f 70 2d  ];.  freeP3(pOp-
3130: 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33  >p3type, pOp->p3
3140: 29 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30  );.  pOp->p3 = 0
3150: 3b 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 29  ;.  if( zP3==0 )
3160: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  {.    pOp->p3 = 
3170: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79  0;.    pOp->p3ty
3180: 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b  pe = P3_NOTUSED;
3190: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
31a0: 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P3_KEYINFO ){.  
31b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
31c0: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  nfo;.    int nFi
31d0: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20  eld, nByte;..   
31e0: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49   nField = ((KeyI
31f0: 6e 66 6f 2a 29 7a 50 33 29 2d 3e 6e 46 69 65 6c  nfo*)zP3)->nFiel
3200: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  d;.    nByte = s
3210: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
3220: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69   + (nField-1)*si
3230: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  zeof(pKeyInfo->a
3240: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c  Coll[0]) + nFiel
3250: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  d;.    pKeyInfo 
3260: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3270: 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  w( nByte );.    
3280: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
3290: 29 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  )pKeyInfo;.    i
32a0: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
32b0: 20 20 20 20 20 63 68 61 72 20 2a 61 53 6f 72 74       char *aSort
32c0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
32d0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
32e0: 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  3, nByte);.     
32f0: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
3300: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3310: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
3320: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
3330: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
3340: 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72  ortOrder = (char
3350: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
3360: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
3370: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
3380: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
3390: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
33a0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
33b0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
33c0: 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P3_KEYINFO;.  
33d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
33e0: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
33f0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3400: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
3410: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3420: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   ){.    pOp->p3 
3430: 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20  = (char*)zP3;.  
3440: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3450: 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P3_KEYINFO;.  }e
3460: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
3470: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68     pOp->p3 = (ch
3480: 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70  ar*)zP3;.    pOp
3490: 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p3type = n;.  
34a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
34b0: 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e  ==0 ) n = strlen
34c0: 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP3);.    pOp->
34d0: 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  p3 = sqliteStrND
34e0: 75 70 28 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20  up(zP3, n);.    
34f0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
3500: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3510: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3520: 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
3530: 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 74 68  e P3 field of th
3540: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3550: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
3560: 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e  n with.** commen
3570: 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20  t text..*/.void 
3580: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65  sqlite3VdbeComme
3590: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
35a0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
35b0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
35c0: 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70   ap;.  assert( p
35d0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
35e0: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
35f0: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
3600: 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 73 71 6c 69  1].p3==0 || sqli
3610: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
3620: 46 61 69 6c 65 64 20 29 3b 0a 20 20 76 61 5f 73  Failed );.  va_s
3630: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
3640: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3650: 43 68 61 6e 67 65 50 33 28 70 2c 20 2d 31 2c 20  ChangeP3(p, -1, 
3660: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
3670: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33  zFormat, ap), P3
3680: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f  _DYNAMIC);.  va_
3690: 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69  end(ap);.}.#endi
36a0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
36b0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
36c0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
36d0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
36e0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
36f0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3700: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3710: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3720: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
3730: 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72   addr>=0 && addr
3740: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74  <p->nOp );.  ret
3750: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
3760: 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  ];.}..#if !defin
3770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
3780: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
3790: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
37a0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
37b0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
37c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
37d0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
37e0: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
37f0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
3800: 33 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  3 parameter for 
3810: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
3820: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
3830: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
3840: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
3850: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3860: 2a 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70  *displayP3(Op *p
3870: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
3880: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
3890: 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65  har *zP3;.  asse
38a0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
38b0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
38c0: 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p3type ){.    ca
38d0: 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P3_KEYINFO: {
38e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
38f0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
3900: 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49  pKeyInfo = (KeyI
3910: 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  nfo*)pOp->p3;.  
3920: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d      sprintf(zTem
3930: 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c  p, "keyinfo(%d",
3940: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
3950: 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74  d);.      i = st
3960: 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20  rlen(zTemp);.   
3970: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
3980: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
3990: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
39a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
39b0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
39c0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
39d0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
39e0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
39f0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
3a00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
3a10: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
3a20: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
3a30: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
3a40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
3a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
3a60: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  }.          zTem
3a70: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
3a80: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
3a90: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3aa0: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
3ab0: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
3ac0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
3ad0: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
3ae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3af0: 20 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70     strcpy(&zTemp
3b00: 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  [i], pColl->zNam
3b10: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  e);.          i 
3b20: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  += n;.        }e
3b30: 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d  lse if( i+4<nTem
3b40: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
3b50: 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69   strcpy(&zTemp[i
3b60: 5d 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20  ],",nil");.     
3b70: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
3b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3b90: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
3ba0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
3bb0: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
3bc0: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
3bd0: 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20   );.      zP3 = 
3be0: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
3bf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3c00: 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P3_COLLSEQ: {
3c10: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
3c20: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
3c30: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
3c40: 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20   sprintf(zTemp, 
3c50: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
3c60: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
3c70: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
3c80: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
3c90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3ca0: 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P3_FUNCDEF: {.  
3cb0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
3cc0: 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f  f = (FuncDef*)pO
3cd0: 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 63 68 61  p->p3;.      cha
3ce0: 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20  r zNum[30];.    
3cf0: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
3d00: 20 22 25 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c 20   "%.*s", nTemp, 
3d10: 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pDef->zName);.  
3d20: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d      sprintf(zNum
3d30: 2c 22 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 6e  ,"(%d)", pDef->n
3d40: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
3d50: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 2b 73 74  strlen(zTemp)+st
3d60: 72 6c 65 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e 54  rlen(zNum)+1<=nT
3d70: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
3d80: 74 72 63 61 74 28 7a 54 65 6d 70 2c 20 7a 4e 75  trcat(zTemp, zNu
3d90: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
3da0: 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP3 = zTemp;. 
3db0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3dc0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
3dd0: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70  .      zP3 = pOp
3de0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p3;.      if( 
3df0: 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f  zP3==0 || pOp->o
3e00: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  pcode==OP_Noop )
3e10: 7b 0a 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20  {.        zP3 = 
3e20: 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  "";.      }.    
3e30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
3e40: 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  P3;.}.#endif...#
3e50: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
3e60: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
3e70: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
3e80: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
3e90: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
3ea0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3eb0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
3ec0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
3ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
3ee0: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
3ef0: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
3f00: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20  {.  char *zP3;. 
3f10: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
3f20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
3f30: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
3f40: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
3f50: 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  4d %s\n";.  if( 
3f60: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
3f70: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d   stdout;.  zP3 =
3f80: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
3f90: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
3fa0: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
3fb0: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20  Out, zFormat1,. 
3fc0: 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33       pc, sqlite3
3fd0: 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d  OpcodeNames[pOp-
3fe0: 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70  >opcode], pOp->p
3ff0: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29  1, pOp->p2, zP3)
4000: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
4010: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4020: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
4030: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
4040: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
4050: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
4060: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
4070: 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  N){.  if( p ){. 
4080: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20     while( N-->0 
4090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
40a0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
40b0: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ++);.    }.  }.}
40c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
40d0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
40e0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
40f0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
4100: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
4110: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
4120: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
4130: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
4140: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
4150: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
4160: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
4170: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
4180: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
4190: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
41a0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
41b0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
41c0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
41d0: 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73  PLAIN"..*/.int s
41e0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
41f0: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4210: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
4220: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4230: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
4240: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4250: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
4260: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  ->explain );.  i
4270: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
4280: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65  E_MAGIC_RUN ) re
4290: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
42a0: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  SE;.  assert( db
42b0: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
42c0: 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20  MAGIC_BUSY );.  
42d0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
42e0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
42f0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
4300: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
4310: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
4320: 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e  does not put dyn
4330: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74  amic strings ont
4340: 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73  o the.  ** the s
4350: 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62  tack, they may b
4360: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
4370: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
4380: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
4390: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
43a0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
43b0: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
43c0: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  coding..  */.  i
43d0: 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e  f( p->pTos==&p->
43e0: 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20  aStack[4] ){.   
43f0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
4400: 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a  (p->aStack, 5);.
4410: 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74    }.  p->resOnSt
4420: 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a  ack = 0;..  do{.
4430: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
4440: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e  .  }while( i<p->
4450: 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  nOp && p->explai
4460: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
4470: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
4480: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
4490: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
44a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
44b0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
44c0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
44d0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
44e0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
44f0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
4500: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
4510: 65 72 72 75 70 74 3b 0a 20 20 20 20 70 2d 3e 72  errupt;.    p->r
4520: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
4530: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
4540: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4550: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
4560: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
4570: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
4580: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
4590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
45a0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
45b0: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
45c0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
45d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
45e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
45f0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
4600: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
4610: 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20  em->i = i;      
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
4640: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
4650: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
4660: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
4670: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
4680: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
4690: 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65  pMem->z = sqlite
46a0: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70  3OpcodeNames[pOp
46b0: 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f  ->opcode];  /* O
46c0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65  pcode */.    pMe
46d0: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
46e0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
46f0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
4700: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
4710: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
4720: 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  8;.    pMem++;..
4730: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
4740: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
4750: 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31  Mem->i = pOp->p1
4760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
4780: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
4790: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
47a0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
47b0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
47c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
47d0: 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e   pMem->i = pOp->
47e0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4800: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
4810: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
4820: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
4830: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
4840: 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c  ags = MEM_Short|
4850: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
4860: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
4870: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
4880: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
4890: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
48a0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
48b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
48c0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
48d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
48e0: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
48f0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
4900: 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 2*(p->explain
4910: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  -1);.    p->pTos
4920: 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e   = pMem;.    p->
4930: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4940: 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63      p->resOnStac
4950: 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
4960: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
4970: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
4980: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4990: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
49a0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
49b0: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
49c0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
49d0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
49e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
49f0: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
4a00: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
4a10: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  TE_DEBUG.  int n
4a20: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
4a30: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
4a40: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
4a50: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
4a60: 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20  p[nOp-1];.  if( 
4a70: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4a80: 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21  Noop && pOp->p3!
4a90: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
4aa0: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
4ab0: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  3;.    while( is
4ac0: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29  space(*(u8*)z) )
4ad0: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
4ae0: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
4af0: 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
4b10: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
4b20: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e  e for execution.
4b30: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
4b40: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
4b50: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61  s allocating sta
4b60: 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69  ck space and ini
4b70: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
4b80: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
4b90: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
4ba0: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
4bb0: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
4bc0: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
4bd0: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
4be0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
4bf0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  .  .**.** This i
4c00: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
4c10: 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72  o move a VDBE fr
4c20: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  om VDBE_MAGIC_IN
4c30: 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  IT to.** VDBE_MA
4c40: 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64  GIC_RUN..*/.void
4c50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4c60: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
4c70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4c80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
4c90: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  DBE */.  int nVa
4ca0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
4cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4cc0: 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20  r of '?' see in 
4cd0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
4ce0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c  t */.  int nMem,
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4d10: 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
4d20: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
4d30: 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20   int nCursor,   
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
4d60: 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  sors to allocate
4d70: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
4d80: 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ain             
4d90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4da0: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
4db0: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
4dc0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  */.){.  int n;..
4dd0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4de0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4df0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4e00: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
4e10: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
4e20: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
4e30: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
4e40: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
4e50: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
4e60: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
4e70: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
4e80: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 54  er than later. T
4e90: 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63 61  his.   * is beca
4ea0: 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
4eb0: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29 20  resizeOpArray() 
4ec0: 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b  below may shrink
4ed0: 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70   the.   * p->aOp
4ee0: 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76 65  [] array to save
4ef0: 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65   memory if calle
4f00: 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d  d when in VDBE_M
4f10: 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73  AGIC_RUN .   * s
4f20: 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d  tate..   */.  p-
4f30: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
4f40: 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e  GIC_RUN;..  /* N
4f50: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76  o instruction ev
4f60: 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74  er pushes more t
4f70: 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  han a single ele
4f80: 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20  ment onto the.  
4f90: 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74  ** stack.  And t
4fa0: 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67  he stack never g
4fb0: 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69  rows on successi
4fc0: 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66  ve executions of
4fd0: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c   the.  ** same l
4fe0: 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74  oop.  So the tot
4ff0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73  al number of ins
5000: 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20  tructions is an 
5010: 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a  upper bound.  **
5020: 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   on the maximum 
5030: 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71 75  stack depth requ
5040: 69 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c 61  ired.  (Added la
5050: 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20  ter:)  The.  ** 
5060: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
5070: 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20  ) call computes 
5080: 61 20 74 69 67 68 74 65 72 20 75 70 70 65 72 20  a tighter upper 
5090: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a  bound on the.  *
50a0: 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20  * stack size..  
50b0: 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69  **.  ** Allocati
50c0: 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b  on all the stack
50d0: 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65   space we will e
50e0: 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20  ver need..  */. 
50f0: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d   if( p->aStack==
5100: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
5110: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
5120: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
5130: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
5140: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
5150: 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b  .    int nStack;
5160: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
5170: 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b 20  number of stack 
5180: 65 6e 74 72 69 65 73 20 72 65 71 75 69 72 65 64  entries required
5190: 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50   */.    resolveP
51a0: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
51b0: 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20  , &nStack);.    
51c0: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
51d0: 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73   p->nOp);.    as
51e0: 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b  sert( nVar>=0 );
51f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 74  .    assert( nSt
5200: 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ack<p->nOp );.  
5210: 20 20 6e 53 74 61 63 6b 20 3d 20 69 73 45 78 70    nStack = isExp
5220: 6c 61 69 6e 20 3f 20 31 30 20 3a 20 6e 53 74 61  lain ? 10 : nSta
5230: 63 6b 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63  ck;.    p->aStac
5240: 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  k = sqliteMalloc
5250: 28 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b  (.        nStack
5260: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63  *sizeof(p->aStac
5270: 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61  k[0])    /* aSta
5280: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41  ck */.      + nA
5290: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20  rg*sizeof(Mem*) 
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b  apArg */.      +
52c0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
52d0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
52e0: 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20  /* aVar */.     
52f0: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63   + nVar*sizeof(c
5300: 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20  har*)           
5310: 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20    /* azVar */.  
5320: 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f      + nMem*sizeo
5330: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
5340: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a       /* aMem */.
5350: 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a        + nCursor*
5360: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20  sizeof(Cursor*) 
5370: 20 20 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20         /* apCsr 
5380: 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  */.    );.    if
5390: 28 20 21 73 71 6c 69 74 65 33 54 73 64 28 29 2d  ( !sqlite3Tsd()-
53a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
53b0: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  .      p->aMem =
53c0: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61   &p->aStack[nSta
53d0: 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  ck];.      p->nM
53e0: 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20  em = nMem;.     
53f0: 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61   p->aVar = &p->a
5400: 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20  Mem[nMem];.     
5410: 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b   p->nVar = nVar;
5420: 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20  .      p->okVar 
5430: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  = 0;.      p->ap
5440: 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d  Arg = (Mem**)&p-
5450: 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  >aVar[nVar];.   
5460: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63     p->azVar = (c
5470: 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b  har**)&p->apArg[
5480: 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nArg];.      p->
5490: 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a  apCsr = (Cursor*
54a0: 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72  *)&p->azVar[nVar
54b0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72  ];.      p->nCur
54c0: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
54d0: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
54e0: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
54f0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
5500: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
5510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5520: 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c   }.  for(n=0; n<
5530: 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  p->nMem; n++){. 
5540: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
5550: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
5560: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
5570: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28  TE_DEBUG.  if( (
5580: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
5590: 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e  QLITE_VdbeListin
55a0: 67 29 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c  g)!=0.    || sql
55b0: 69 74 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73  ite3Os.xFileExis
55c0: 74 73 28 22 76 64 62 65 5f 65 78 70 6c 61 69 6e  ts("vdbe_explain
55d0: 22 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  ").  ){.    int 
55e0: 69 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56  i;.    printf("V
55f0: 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74  DBE Program List
5600: 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71  ing:\n");.    sq
5610: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
5620: 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  l(p);.    for(i=
5630: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
5640: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5650: 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f  VdbePrintOp(stdo
5660: 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
5670: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
5680: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 2e 78 46  if( sqlite3Os.xF
5690: 69 6c 65 45 78 69 73 74 73 28 22 76 64 62 65 5f  ileExists("vdbe_
56a0: 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20 20 70  trace") ){.    p
56b0: 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  ->trace = stdout
56c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
56d0: 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74  ->pTos = &p->aSt
56e0: 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63  ack[-1];.  p->pc
56f0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
5700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
5710: 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a  >uniqueCnt = 0;.
5720: 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68    p->returnDepth
5730: 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72   = 0;.  p->error
5740: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
5750: 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b  t;.  p->popStack
5760: 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c   =  0;.  p->expl
5770: 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e  ain |= isExplain
5780: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
5790: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
57a0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
57b0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
57c0: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74  FILE.  {.    int
57d0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
57e0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
57f0: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
5800: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  .cnt = 0;.      
5810: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
5820: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5830: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
5840: 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61  Close a cursor a
5850: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
5860: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
5870: 74 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73  t cursor happens
5880: 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  .** to hold..*/.
5890: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
58a0: 46 72 65 65 43 75 72 73 6f 72 28 43 75 72 73 6f  FreeCursor(Curso
58b0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
58c0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
58d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
58e0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
58f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
5900: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
5910: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
5920: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
5930: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
5940: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
5950: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
5960: 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pCx->pData);. 
5970: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d   sqliteFree(pCx-
5980: 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74  >aType);.  sqlit
5990: 65 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f  eFree(pCx);.}../
59a0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
59b0: 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63  ursors.*/.static
59c0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
59d0: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
59e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
59f0: 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74  ->apCsr==0 ) ret
5a00: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
5a10: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
5a20: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
5a30: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
5a40: 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20  >apCsr[i]);.    
5a50: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
5a60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
5a70: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
5a80: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
5a90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5aa0: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
5ab0: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
5ac0: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
5ad0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
5ae0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
5af0: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
5b00: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
5b10: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
5b20: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
5b30: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
5b40: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
5b50: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
5b60: 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  .  if( p->aStack
5b70: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
5b80: 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63  emArray(p->aStac
5b90: 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20  k, 1 + (p->pTos 
5ba0: 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20  - p->aStack));. 
5bb0: 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d     p->pTos = &p-
5bc0: 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d  >aStack[-1];.  }
5bd0: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
5be0: 72 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65  rs(p);.  release
5bf0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
5c00: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71  , p->nMem);.  sq
5c10: 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65  lite3VdbeFifoCle
5c20: 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20  ar(&p->sFifo);. 
5c30: 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53   if( p->contextS
5c40: 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28  tack ){.    for(
5c50: 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78  i=0; i<p->contex
5c60: 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b  tStackTop; i++){
5c70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5c80: 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e  beFifoClear(&p->
5c90: 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e  contextStack[i].
5ca0: 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  sFifo);.    }.  
5cb0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
5cc0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20  contextStack);. 
5cd0: 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53   }.  p->contextS
5ce0: 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  tack = 0;.  p->c
5cf0: 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74 68  ontextStackDepth
5d00: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65   = 0;.  p->conte
5d10: 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a  xtStackTop = 0;.
5d20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
5d30: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
5d40: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ErrMsg = 0;.}../
5d50: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
5d60: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5d70: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
5d80: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
5d90: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
5da0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
5db0: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
5dc0: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
5dd0: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
5de0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
5df0: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
5e00: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
5e10: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
5e20: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
5e30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
5e40: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
5e50: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
5e60: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
5e70: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
5e80: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
5e90: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
5ea0: 20 69 6e 74 20 6e 3b 0a 20 20 72 65 6c 65 61 73   int n;.  releas
5eb0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
5ec0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
5ed0: 6c 75 6d 6e 2a 32 29 3b 0a 20 20 73 71 6c 69 74  lumn*2);.  sqlit
5ee0: 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d  eFree(p->aColNam
5ef0: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
5f00: 6c 75 6d 6e 2a 32 3b 0a 20 20 70 2d 3e 6e 52 65  lumn*2;.  p->nRe
5f10: 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f  sColumn = nResCo
5f20: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
5f30: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
5f40: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 4d 61 6c   (Mem*)sqliteMal
5f50: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29  loc( sizeof(Mem)
5f60: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
5f70: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
5f80: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
5f90: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 28 70 43  - > 0 ){.    (pC
5fa0: 6f 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73  olName++)->flags
5fb0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d   = MEM_Null;.  }
5fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5fd0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
5fe0: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
5ff0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
6000: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
6010: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
6020: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
6030: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
6040: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
6050: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
6060: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
6070: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
6080: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
6090: 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41  .** If N==P3_STA
60a0: 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68  TIC  it means th
60b0: 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f  at zName is a po
60c0: 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74  inter to a const
60d0: 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74  ant static.** st
60e0: 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20  ring and we can 
60f0: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
6100: 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20  inter. If it is 
6110: 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  P3_DYNAMIC, then
6120: 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20   .** the string 
6130: 69 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  is freed using s
6140: 71 6c 69 74 65 46 72 65 65 28 29 20 77 68 65 6e  qliteFree() when
6150: 20 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e   the vdbe is fin
6160: 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74  ished with.** it
6170: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62  . Otherwise, N b
6180: 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72  ytes of zName ar
6190: 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74  e copied..*/.int
61a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
61b0: 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20  olName(Vdbe *p, 
61c0: 69 6e 74 20 69 64 78 2c 20 63 6f 6e 73 74 20 63  int idx, const c
61d0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
61e0: 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  N){.  int rc;.  
61f0: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
6200: 20 61 73 73 65 72 74 28 20 69 64 78 3c 28 32 2a   assert( idx<(2*
6210: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29  p->nResColumn) )
6220: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
6230: 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
6240: 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
6250: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65  TE_NOMEM;.  asse
6260: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
6270: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
6280: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
6290: 5b 69 64 78 5d 29 3b 0a 20 20 69 66 28 20 4e 3d  [idx]);.  if( N=
62a0: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e  =P3_DYNAMIC || N
62b0: 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a 20  ==P3_STATIC ){. 
62c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
62d0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
62e0: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
62f0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
6300: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
6310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
6320: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
6330: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
6340: 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45  zName, N, SQLITE
6350: 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
6360: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69  NSIENT);.  }.  i
6370: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6380: 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49   && N==P3_DYNAMI
6390: 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  C ){.    pColNam
63a0: 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c  e->flags = (pCol
63b0: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45  Name->flags&(~ME
63c0: 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44  M_Static))|MEM_D
63d0: 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  yn;.    pColName
63e0: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->xDel = 0;.  }.
63f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6400: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
6410: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
6420: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
6430: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
6440: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
6450: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
6460: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
6470: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
6480: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
6490: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
64a0: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
64b0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
64c0: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
64d0: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
64e0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
64f0: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
6500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
6510: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
6520: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
6530: 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
6540: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
6550: 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
6560: 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
6570: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
6580: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6590: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
65a0: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 66 6f  ommit = 0;..  fo
65b0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
65c0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
65d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
65e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
65f0: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6600: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
6610: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
6620: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
6630: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
6640: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Trans++;.    }. 
6650: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
6660: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
6670: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
6680: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
6690: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
66a0: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
66b0: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
66c0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69  allback ){.    i
66d0: 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  nt rc;.    sqlit
66e0: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
66f0: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
6700: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
6710: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
6720: 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79     sqlite3Safety
6730: 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  On(db);.    if( 
6740: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
6750: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
6760: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  AINT;.    }.  }.
6770: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
6780: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
6790: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
67a0: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
67b0: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
67c0: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
67d0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
67e0: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
67f0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
6800: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
6810: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
6820: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
6830: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
6840: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
6850: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
6860: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
6870: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
6880: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
6890: 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74  emory:.  In that
68a0: 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a   case we do.  **
68b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
68c0: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
68d0: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
68e0: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  he simple case t
68f0: 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20  hen.  ** too..  
6900: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c  */.  if( 0==strl
6910: 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  en(sqlite3BtreeG
6920: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
6930: 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e  Db[0].pBt)) || n
6940: 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20  Trans<=1 ){.    
6950: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
6960: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
6970: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
6980: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6990: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
69a0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
69b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
69c0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 70 42  ite3BtreeSync(pB
69d0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
69e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
69f0: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
6a00: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
6a10: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
6a20: 6e 63 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  nced */.    if( 
6a30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6a40: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6a50: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
6a60: 0a 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a  .        Btree *
6a70: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6a80: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 69 66  .pBt;.        if
6a90: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
6aa0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
6ab0: 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
6ac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6ad0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
6ae0: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
6af0: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
6b00: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
6b10: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
6b20: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
6b30: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
6b40: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
6b50: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
6b60: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
6b70: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
6b80: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
6b90: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
6ba0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
6bb0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
6bc0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
6bd0: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
6be0: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
6bf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
6c00: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
6c10: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
6c20: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
6c30: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
6c40: 29 3b 0a 20 20 20 20 4f 73 46 69 6c 65 20 2a 6d  );.    OsFile *m
6c50: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 20 20  aster = 0;..    
6c60: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
6c70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6c80: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  name */.    do {
6c90: 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f  .      u32 rando
6ca0: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  m;.      sqliteF
6cb0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
6cc0: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
6cd0: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e  mness(sizeof(ran
6ce0: 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a  dom), &random);.
6cf0: 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20        zMaster = 
6d00: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
6d10: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
6d20: 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78  nFile, random&0x
6d30: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
6d40: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
6d50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6d60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6d70: 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
6d80: 28 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 69 6c  ( sqlite3Os.xFil
6d90: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
6da0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
6db0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6dc0: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  nal. */.    rc =
6dd0: 20 73 71 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e   sqlite3Os.xOpen
6de0: 45 78 63 6c 75 73 69 76 65 28 7a 4d 61 73 74 65  Exclusive(zMaste
6df0: 72 2c 20 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a  r, &master, 0);.
6e00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6e10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
6e20: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
6e30: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
6e40: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
6e50: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
6e60: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
6e70: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
6e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
6e90: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
6ea0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6eb0: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
6ec0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
6ed0: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
6ee0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
6ef0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6f00: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
6f10: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
6f20: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
6f30: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
6f40: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
6f50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
6f60: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
6f70: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
6f80: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
6f90: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
6fa0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
6fb0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
6fc0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
6fd0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
6fe0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
6ff0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
7000: 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65  nue;   /* Ignore
7010: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
7020: 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  se */.      if( 
7030: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
7040: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
7050: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
7060: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
7070: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7080: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
7090: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
70a0: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
70b0: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
70c0: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
70d0: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
70e0: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
70f0: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
7100: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
7110: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
7120: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
7130: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
7140: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7150: 6d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  master, zFile, s
7160: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 29 3b  trlen(zFile)+1);
7170: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
7180: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
71a0: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
71b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
71c0: 65 33 4f 73 2e 78 44 65 6c 65 74 65 28 7a 4d 61  e3Os.xDelete(zMa
71d0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
71e0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
71f0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
7200: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
7210: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7220: 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   }...    /* Sync
7230: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7240: 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f 72 65  nal file. Before
7250: 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f 70 65   doing this, ope
7260: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  n the directory.
7270: 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65      ** the maste
7280: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
7290: 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20 74 68  s store in so th
72a0: 61 74 20 69 74 20 67 65 74 73 20 73 79 6e 63 65  at it gets synce
72b0: 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  d too..    */.  
72c0: 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    zMainFile = sq
72d0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
72e0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
72f0: 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  pBt);.    rc = s
7300: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
7310: 63 74 6f 72 79 28 6d 61 73 74 65 72 2c 20 7a 4d  ctory(master, zM
7320: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
7330: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7340: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 6e 65  ||.          (ne
7350: 65 64 53 79 6e 63 20 26 26 20 28 72 63 3d 73 71  edSync && (rc=sq
7360: 6c 69 74 65 33 4f 73 53 79 6e 63 28 6d 61 73 74  lite3OsSync(mast
7370: 65 72 2c 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f  er,0))!=SQLITE_O
7380: 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  K) ){.      sqli
7390: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
73a0: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
73b0: 65 33 4f 73 2e 78 44 65 6c 65 74 65 28 7a 4d 61  e3Os.xDelete(zMa
73c0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
73d0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
73e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
73f0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
7400: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
7410: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
7420: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
7430: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
7440: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
7450: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7460: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
7470: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
7480: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
7490: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
74a0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
74b0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
74c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
74d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
74e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
74f0: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
7500: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
7510: 72 65 65 53 79 6e 63 28 29 2c 0a 20 20 20 20 2a  reeSync(),.    *
7520: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
7530: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
7540: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7550: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20   file will be.  
7560: 20 20 2a 2a 20 6f 72 70 68 61 6e 65 64 2e 20 42    ** orphaned. B
7570: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
7580: 65 74 65 20 69 74 2c 20 69 6e 20 63 61 73 65 20  ete it, in case 
7590: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
75a0: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6e  al.    ** file n
75b0: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
75c0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
75d0: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
75e0: 20 66 61 69 6c 75 72 65 0a 20 20 20 20 2a 2a 20   failure.    ** 
75f0: 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  occured..    */.
7600: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
7610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
7620: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
7630: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7640: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
7650: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
7660: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
7670: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7680: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 70  lite3BtreeSync(p
7690: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
76a0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
76b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
76d0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
76e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
76f0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
7700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
7710: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7720: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
7730: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
7740: 73 74 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  ster);..    /* D
7750: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
7760: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
7770: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
7780: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
7790: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
77a0: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
77b0: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
77c0: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
77d0: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
77e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
77f0: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
7800: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
7810: 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74 65  qlite3Os.xDelete
7820: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (zMaster);.    a
7830: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
7840: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69  E_OK );.    sqli
7850: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
7860: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
7870: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
7880: 65 33 4f 73 2e 78 53 79 6e 63 44 69 72 65 63 74  e3Os.xSyncDirect
7890: 6f 72 79 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  ory(zMainFile);.
78a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
78b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
78c0: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 6f  * This is not go
78d0: 6f 64 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  od. The master j
78e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
78f0: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 62 75  been deleted, bu
7900: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  t.      ** the d
7910: 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 66 61  irectory sync fa
7920: 69 6c 65 64 2e 20 54 68 65 72 65 20 69 73 20 6e  iled. There is n
7930: 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 66  o completely saf
7940: 65 20 63 6f 75 72 73 65 20 6f 66 0a 20 20 20 20  e course of.    
7950: 20 20 2a 2a 20 61 63 74 69 6f 6e 20 66 72 6f 6d    ** action from
7960: 20 68 65 72 65 2e 20 54 68 65 20 69 6e 64 69 76   here. The indiv
7970: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 63  idual journals c
7980: 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20  ontain the name 
7990: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
79a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
79b0: 69 6c 65 2c 20 62 75 74 20 74 68 65 72 65 20 69  ile, but there i
79c0: 73 20 6e 6f 20 77 61 79 20 6f 66 20 6b 6e 6f 77  s no way of know
79d0: 69 6e 67 20 69 66 20 74 68 61 74 0a 20 20 20 20  ing if that.    
79e0: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
79f0: 6e 61 6c 20 65 78 69 73 74 73 20 6e 6f 77 20 6f  nal exists now o
7a00: 72 20 69 66 20 69 74 20 77 69 6c 6c 20 65 78 69  r if it will exi
7a10: 73 74 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  st after the ope
7a20: 72 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  rating.      ** 
7a30: 73 79 73 74 65 6d 20 63 72 61 73 68 20 74 68 61  system crash tha
7a40: 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68 65  t may follow the
7a50: 20 66 73 79 6e 63 28 29 20 66 61 69 6c 75 72 65   fsync() failure
7a60: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7a70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7a80: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
7a90: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
7aa0: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
7ab0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
7ac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
7ad0: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
7ae0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
7af0: 74 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  t() are only clo
7b00: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 20 64  sing files and d
7b10: 65 6c 65 74 69 6e 67 0a 20 20 20 20 2a 2a 20 6a  eleting.    ** j
7b20: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
7b30: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7b40: 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68   while this is h
7b50: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
7b60: 74 0a 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20  t.    ** really 
7b70: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
7b80: 69 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ity of the trans
7b90: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
7ba0: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 0a 20 20  y guaranteed,.  
7bb0: 20 20 2a 2a 20 62 75 74 20 73 6f 6d 65 20 73 74    ** but some st
7bc0: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
7bd0: 61 6c 73 20 6d 61 79 20 62 65 20 6c 79 69 6e 67  als may be lying
7be0: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
7bf0: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72 72  ng an.    ** err
7c00: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
7c10: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
7c20: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
7c30: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7c40: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
7c50: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7c60: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
7c70: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
7c80: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
7c90: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
7ca0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7cb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7cc0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72  ./*.** Find ever
7cd0: 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65  y active VM othe
7ce0: 72 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64  r than pVdbe and
7cf0: 20 63 68 61 6e 67 65 20 69 74 73 20 73 74 61 74   change its stat
7d00: 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64  us to.** aborted
7d10: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
7d20: 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73  when one VM caus
7d30: 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75  es a rollback du
7d40: 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f  e to an.** ON CO
7d50: 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20  NFLICT ROLLBACK 
7d60: 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d  clause (for exam
7d70: 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72  ple).  The other
7d80: 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20   VMs must be.** 
7d90: 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20  aborted so that 
7da0: 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65  they do not have
7db0: 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74   data rolled out
7dc0: 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68   from underneath
7dd0: 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67  .** them leading
7de0: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a   to a segfault..
7df0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
7e00: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
7e10: 64 62 65 73 28 56 64 62 65 20 2a 70 56 64 62 65  dbes(Vdbe *pVdbe
7e20: 29 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65  ){.  Vdbe *pOthe
7e30: 72 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d  r;.  for(pOther=
7e40: 70 56 64 62 65 2d 3e 64 62 2d 3e 70 56 64 62 65  pVdbe->db->pVdbe
7e50: 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74 68 65 72  ; pOther; pOther
7e60: 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b  =pOther->pNext){
7e70: 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 3d  .    if( pOther=
7e80: 3d 70 56 64 62 65 20 29 20 63 6f 6e 74 69 6e 75  =pVdbe ) continu
7e90: 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65  e;.    if( pOthe
7ea0: 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  r->magic!=VDBE_M
7eb0: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 4f 74 68  AGIC_RUN || pOth
7ec0: 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f 6e 74 69  er->pc<0 ) conti
7ed0: 6e 75 65 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c  nue;.    closeAl
7ee0: 6c 43 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29  lCursors(pOther)
7ef0: 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 61 62  ;.    pOther->ab
7f00: 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  orted = 1;.  }.}
7f10: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
7f20: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
7f30: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
7f40: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
7f50: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
7f60: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
7f70: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
7f80: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
7f90: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
7fa0: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
7fb0: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
7fc0: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
7fd0: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
7fe0: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
7ff0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
8000: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
8010: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
8020: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
8030: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
8040: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
8050: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
8060: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
8070: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
8080: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
8090: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
80a0: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
80b0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
80c0: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
80d0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
80e0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
80f0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
8100: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
8110: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
8120: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
8130: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8140: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
8150: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
8160: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
8170: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
8180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
8190: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
81a0: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
81b0: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
81c0: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
81d0: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
81e0: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
81f0: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
8200: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
8210: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
8220: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
8230: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
8240: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
8250: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8260: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
8270: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
8280: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
8290: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
82a0: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
82b0: 41 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a  AGIC_HALT..**.**
82c0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
82d0: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
82e0: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
82f0: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
8300: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
8310: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
8320: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
8330: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
8340: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
8350: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
8360: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
8370: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
8380: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
8390: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
83a0: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
83b0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
83c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28    int i;.  int (
83d0: 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70  *xFunc)(Btree *p
83e0: 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e  Bt) = 0;  /* Fun
83f0: 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e  ction to call on
8400: 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b   each btree back
8410: 65 6e 64 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  end */..  if( sq
8420: 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c  lite3Tsd()->mall
8430: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
8440: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
8450: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OMEM;.  }..  if(
8460: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
8470: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
8480: 20 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 6c 74   /* Already halt
8490: 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20  ed.  Nothing to 
84a0: 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  do. */.    asser
84b0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
84c0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a  E_MAGIC_HALT );.
84d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
84e0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  E_OK;.  }.  clos
84f0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
8500: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
8510: 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
8520: 70 2d 3e 70 63 3c 30 20 29 7b 0a 20 20 20 20 2f  p->pc<0 ){.    /
8530: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
8540: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
8550: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
8560: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
8570: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 61   }else if( db->a
8580: 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
8590: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d  >activeVdbeCnt==
85a0: 31 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d  1 ){..    if( p-
85b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
85c0: 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
85d0: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 70 2d  n==OE_Fail && p-
85e0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc!=SQLITE_NOME
85f0: 4d 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  M)){.      /* Th
8600: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
8610: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 72  ag is true, ther
8620: 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 61  e are no other a
8630: 63 74 69 76 65 20 71 75 65 72 69 65 73 0a 20 20  ctive queries.  
8640: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 69      ** using thi
8650: 73 20 68 61 6e 64 6c 65 20 61 6e 64 20 74 68 65  s handle and the
8660: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
8670: 73 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  s successful or 
8680: 68 69 74 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  hit an.      ** 
8690: 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
86a0: 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  aint. This means
86b0: 20 61 20 63 6f 6d 6d 69 74 20 69 73 20 72 65 71   a commit is req
86c0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
86d0: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76        int rc = v
86e0: 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  dbeCommit(db);. 
86f0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
8700: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
8710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8720: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 65  E_BUSY;.      }e
8730: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
8740: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
8750: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
8760: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
8770: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
8780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8790: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
87a0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
87b0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
87c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
87d0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
87e0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  db);.    }.  }el
87f0: 73 65 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  se{..    if( p->
8800: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
8810: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
8820: 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74  s loop does stat
8830: 69 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74  ic analysis of t
8840: 68 65 20 71 75 65 72 79 20 74 6f 20 73 65 65 20  he query to see 
8850: 77 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20  which of the.   
8860: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
8870: 74 68 72 65 65 20 63 61 74 65 67 6f 72 69 65 73  three categories
8880: 20 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a   it falls into:.
8890: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
88a0: 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a  *     Read-only.
88b0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65        **     Que
88c0: 72 79 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e  ry with statemen
88d0: 74 20 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20  t journal       
88e0: 20 20 20 2d 3e 20 72 6f 6c 6c 62 61 63 6b 20 73     -> rollback s
88f0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
8900: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
8910: 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  out statement jo
8920: 75 72 6e 61 6c 20 20 20 20 20 20 20 2d 3e 20 72  urnal       -> r
8930: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
8940: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ion.      **.   
8950: 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64     ** We could d
8960: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65  o something more
8970: 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68   elegant than th
8980: 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73  is static analys
8990: 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a  is (i.e..      *
89a0: 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79 70 65  * store the type
89b0: 20 6f 66 20 71 75 65 72 79 20 61 73 20 70 61 72   of query as par
89c0: 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61  t of the complia
89d0: 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74  tion phase), but
89e0: 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c   .      ** handl
89f0: 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ing malloc() fai
8a00: 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c 79  lure is a fairly
8a10: 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63 61   obscure edge ca
8a20: 73 65 20 73 6f 20 74 68 69 73 20 69 73 0a 20 20  se so this is.  
8a30: 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
8a40: 65 61 73 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a  easier..      **
8a50: 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20  .      ** Todo: 
8a60: 54 68 69 73 20 6d 65 61 6e 73 20 77 65 20 61 6c  This means we al
8a70: 77 61 79 73 20 6f 76 65 72 72 69 64 65 20 74 68  ways override th
8a80: 65 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  e p->errorAction
8a90: 20 76 61 6c 75 65 20 66 6f 72 20 61 0a 20 20 20   value for a.   
8aa0: 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66     ** malloc() f
8ab0: 61 69 6c 75 72 65 2e 20 49 73 20 74 68 65 72 65  ailure. Is there
8ac0: 20 61 6e 79 20 6f 74 68 65 72 20 63 68 6f 69 63   any other choic
8ad0: 65 20 68 65 72 65 20 74 68 6f 75 67 68 3f 0a 20  e here though?. 
8ae0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
8af0: 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 31  t isReadOnly = 1
8b00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53 74  ;.      int isSt
8b10: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
8b20: 20 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70     assert(p->aOp
8b30: 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a   || p->nOp==0);.
8b40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8b50: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a  <p->nOp; i++){ .
8b60: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
8b70: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8b80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
8b90: 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  se OP_Transactio
8ba0: 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  n:.            i
8bb0: 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  sReadOnly = 0;. 
8bc0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
8be0: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20   OP_Statement:. 
8bf0: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74 61             isSta
8c00: 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  tement = 1;.    
8c10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8c20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8c30: 0a 20 20 20 20 20 20 69 66 28 20 28 69 73 52 65  .      if( (isRe
8c40: 61 64 4f 6e 6c 79 7c 7c 69 73 53 74 61 74 65 6d  adOnly||isStatem
8c50: 65 6e 74 29 20 26 26 20 70 2d 3e 65 72 72 6f 72  ent) && p->error
8c60: 41 63 74 69 6f 6e 21 3d 4f 45 5f 52 6f 6c 6c 62  Action!=OE_Rollb
8c70: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ack ){.        p
8c80: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
8c90: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
8ca0: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
8cb0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
8cc0: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20   OE_Rollback;.  
8cd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8ce0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8cf0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
8d00: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
8d10: 20 29 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20   ){.      xFunc 
8d20: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
8d30: 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 7d 65  mmitStmt;.    }e
8d40: 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
8d50: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
8d60: 20 29 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20   ){.      xFunc 
8d70: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
8d80: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
8d90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 62 6f  }else{.      abo
8da0: 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62  rtOtherActiveVdb
8db0: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  es(p);.      sql
8dc0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
8dd0: 64 62 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61  db);.      db->a
8de0: 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
8df0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
8e00: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
8e10: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
8e20: 6f 6e 65 20 6f 66 20 0a 20 20 2a 2a 20 73 71 6c  one of .  ** sql
8e30: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
8e40: 6b 53 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  kStmt or sqlite3
8e50: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e  BtreeCommitStmt.
8e60: 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e   Call it once on
8e70: 0a 20 20 2a 2a 20 65 61 63 68 20 62 61 63 6b 65  .  ** each backe
8e80: 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  nd. If an error 
8e90: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 72  occurs and the r
8ea0: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74  eturn code is st
8eb0: 69 6c 6c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ill.  ** SQLITE_
8ec0: 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75  OK, set the retu
8ed0: 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  rn code to the n
8ee0: 65 77 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ew error value..
8ef0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 21 78    */.  assert(!x
8f00: 46 75 6e 63 20 7c 7c 0a 20 20 20 20 78 46 75 6e  Func ||.    xFun
8f10: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43  c==sqlite3BtreeC
8f20: 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20  ommitStmt ||.   
8f30: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
8f40: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
8f50: 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  .  );.  for(i=0;
8f60: 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e   xFunc && i<db->
8f70: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
8f80: 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
8f90: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
8fa0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
8fb0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 72 63   pBt ){.      rc
8fc0: 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a 20   = xFunc(pBt);. 
8fd0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
8fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
8ff0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
9000: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
9010: 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
9020: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 2c  PDATE or DELETE,
9030: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
9040: 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 69 66  counter. */.  if
9050: 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
9060: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
9070: 20 20 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c      if( !xFunc |
9080: 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33  | xFunc==sqlite3
9090: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
90a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
90b0: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
90c0: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
90d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
90e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
90f0: 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
9100: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 68 61     }.    p->nCha
9110: 6e 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nge = 0;.  }..  
9120: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
9130: 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
9140: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
9150: 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  curred. */.  if(
9160: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
9170: 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
9180: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
9190: 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ges ){.    sqlit
91a0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
91b0: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
91c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64    db->flags = (d
91d0: 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54  b->flags | SQLIT
91e0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
91f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
9200: 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
9210: 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
9220: 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
9230: 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
9240: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
9250: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
9260: 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a  eVdbeCnt--;.  }.
9270: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
9280: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
9290: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
92a0: 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72  nt(db);..  retur
92b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
92c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
92d0: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
92e0: 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
92f0: 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
9300: 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
9310: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
9320: 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
9330: 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
9340: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
9350: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
9360: 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
9370: 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
9380: 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
9390: 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
93a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
93b0: 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
93c0: 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
93d0: 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
93e0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
93f0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
9400: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
9410: 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
9420: 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
9430: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
9440: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
9450: 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
9460: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
9470: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
9480: 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  && p->magic!=VDB
9490: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
94a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
94b0: 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d  (p->db, SQLITE_M
94c0: 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 72  ISUSE, 0);.    r
94d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
94e0: 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  USE;.  }..  /* I
94f0: 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
9500: 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
9510: 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
9520: 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
9530: 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
9540: 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
9550: 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
9560: 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
9570: 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
9580: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
9590: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
95a0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
95b0: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
95c0: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
95d0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
95e0: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
95f0: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
9600: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
9610: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
9620: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
9630: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
9640: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
9650: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
9660: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
9670: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
9680: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
9690: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
96a0: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
96b0: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
96c0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
96d0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
96e0: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
96f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9700: 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c  or(p->db, p->rc,
9710: 20 22 25 73 22 2c 20 70 2d 3e 7a 45 72 72 4d 73   "%s", p->zErrMs
9720: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
9730: 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29  Free(p->zErrMsg)
9740: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d  ;.      p->zErrM
9750: 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  sg = 0;.    }els
9760: 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20  e if( p->rc ){. 
9770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9780: 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20  r(p->db, p->rc, 
9790: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
97a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
97b0: 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  r(p->db, SQLITE_
97c0: 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  OK, 0);.    }.  
97d0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
97e0: 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
97f0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
9800: 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
9810: 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
9820: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
9830: 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
9840: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
9850: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
9860: 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
9870: 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
9880: 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
9890: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
98a0: 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
98b0: 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
98c0: 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64  qlite3Error(p->d
98d0: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
98e0: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
98f0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
9900: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
9910: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
9920: 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
9930: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
9940: 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
9950: 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  un..  */.  asser
9960: 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61  t( p->pTos<&p->a
9970: 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a  Stack[p->pc<0?0:
9980: 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61 53  p->pc] || !p->aS
9990: 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20 56  tack );.#ifdef V
99a0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
99b0: 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
99c0: 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
99d0: 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
99e0: 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
99f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9a00: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
9a10: 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
9a20: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
9a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9a40: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
9a50: 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
9a60: 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
9a70: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
9a80: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
9a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
9aa0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
9ab0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
9ac0: 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
9ad0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
9ae0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
9af0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
9b00: 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
9b10: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
9b20: 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
9b30: 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
9b40: 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
9b50: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
9b60: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
9b70: 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
9b80: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
9b90: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
9ba0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
9bb0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
9bc0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
9bd0: 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b   p->aborted = 0;
9be0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9bf0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20  LITE_SCHEMA ){. 
9c00: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
9c10: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 70 2d  nternalSchema(p-
9c20: 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  >db, 0);.  }.  r
9c30: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 20  eturn p->rc;.}. 
9c40: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
9c50: 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
9c60: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
9c70: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
9c80: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
9c90: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
9ca0: 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
9cb0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
9cc0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
9cd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
9ce0: 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
9cf0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
9d00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
9d10: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
9d20: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
9d30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9d40: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
9d50: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
9d60: 52 65 73 65 74 28 70 29 3b 0a 20 20 7d 65 6c 73  Reset(p);.  }els
9d70: 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d  e if( p->magic!=
9d80: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
9d90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9da0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
9db0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
9dc0: 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
9dd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
9de0: 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74  all the destruct
9df0: 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64  or for each auxd
9e00: 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64  ata entry in pVd
9e10: 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68  beFunc for which
9e20: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
9e30: 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73  nding bit in mas
9e40: 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78  k is clear.  Aux
9e50: 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79  data entries bey
9e60: 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c  ond 31.** are al
9e70: 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20  ways destroyed. 
9e80: 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20   To destroy all 
9e90: 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c  auxdata entries,
9ea0: 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f   call this.** ro
9eb0: 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d  utine with mask=
9ec0: 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =0..*/.void sqli
9ed0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
9ee0: 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70  Data(VdbeFunc *p
9ef0: 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61  VdbeFunc, int ma
9f00: 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sk){.  int i;.  
9f10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65  for(i=0; i<pVdbe
9f20: 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29  Func->nAux; i++)
9f30: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78  {.    struct Aux
9f40: 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56  Data *pAux = &pV
9f50: 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69  dbeFunc->apAux[i
9f60: 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31  ];.    if( (i>31
9f70: 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69   || !(mask&(1<<i
9f80: 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75  ))) && pAux->pAu
9f90: 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  x ){.      if( p
9fa0: 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
9fb0: 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
9fc0: 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
9fd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9fe0: 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b   pAux->pAux = 0;
9ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a000: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
a010: 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
a020: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
a030: 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
a040: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
a050: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43  =0 ) return;.  C
a060: 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66 28  leanup(p);.  if(
a070: 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
a080: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
a090: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
a0a0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
a0b0: 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d  ( p->db->pVdbe==
a0c0: 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e  p );.    p->db->
a0d0: 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
a0e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
a0f0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
a100: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
a110: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
a120: 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  ( p->aOp ){.    
a130: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a140: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4f  p; i++){.      O
a150: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
a160: 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72 65 65 50  [i];.      freeP
a170: 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70  3(pOp->p3type, p
a180: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7d 0a 20  Op->p3);.    }. 
a190: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
a1a0: 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  >aOp);.  }.  rel
a1b0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
a1c0: 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
a1d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
a1e0: 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
a1f0: 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29  eFree(p->aStack)
a200: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
a210: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
a220: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 32   p->nResColumn*2
a230: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a240: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
a250: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
a260: 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71  MAGIC_DEAD;.  sq
a270: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
a280: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
a290: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
a2a0: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
a2b0: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
a2c0: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
a2d0: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
a2e0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
a2f0: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
a300: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
a310: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
a320: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
a330: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
a340: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
a350: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
a360: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
a370: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
a380: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
a390: 72 63 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  rc;.    extern i
a3a0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
a3b0: 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61 73 73  h_count;.    ass
a3c0: 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
a3d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  );.    if( p->is
a3e0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  Table ){.      r
a3f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a400: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
a410: 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
a420: 61 72 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20  arget, &res);.  
a430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
a440: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a450: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
a460: 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76  r,(char*)&p->mov
a470: 65 74 6f 54 61 72 67 65 74 2c 0a 20 20 20 20 20  etoTarget,.     
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
a4a0: 69 36 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20  i64),&res);.    
a4b0: 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
a4c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70  eturn rc;.    *p
a4d0: 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a  ->pIncrKey = 0;.
a4e0: 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64      p->lastRowid
a4f0: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d   = keyToInt(p->m
a500: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20  ovetoTarget);.  
a510: 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69    p->rowidIsVali
a520: 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20  d = res==0;.    
a530: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
a540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
a550: 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72  treeNext(p->pCur
a560: 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
a570: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a580: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
a590: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
a5a0: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64  ount++;.    p->d
a5b0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
a5c0: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 56  0;.    p->cacheV
a5d0: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  alid = 0;.  }.  
a5e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a5f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
a600: 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
a610: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
a620: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
a630: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
a640: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
a650: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
a660: 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71  rialRead().** sq
a670: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
a680: 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
a690: 64 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29  dbeSerialWrite()
a6a0: 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
a6b0: 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
a6c0: 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
a6d0: 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
a6e0: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
a6f0: 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
a700: 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
a710: 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
a720: 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
a730: 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
a740: 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
a750: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
a760: 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
a770: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
a780: 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
a790: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
a7a0: 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
a7b0: 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
a7c0: 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
a7d0: 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
a7e0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
a7f0: 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
a800: 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
a810: 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
a820: 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
a830: 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
a840: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
a850: 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
a860: 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
a870: 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
a880: 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
a890: 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
a8a0: 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
a8b0: 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
a8c0: 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
a8d0: 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
a8e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
a8f0: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
a900: 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
a910: 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
a920: 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
a930: 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
a940: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
a950: 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
a960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
a970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
a980: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
a990: 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
a9c0: 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
a9f0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
aa00: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
aa10: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
aa20: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
aa30: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
aa60: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
aa70: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
aaa0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
aab0: 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
aac0: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
aad0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
aae0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
ab10: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
ab20: 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
ab40: 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
ab50: 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 38 2d 31 31  loat.**     8-11
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
ab90: 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
aba0: 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
abb0: 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
abc0: 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
abd0: 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
abe0: 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
abf0: 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a    text.**.*/../*
ac00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
ac10: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
ac20: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
ac30: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
ac40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ac50: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29  lType(Mem *pMem)
ac60: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
ac70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20  pMem->flags;..  
ac80: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
ac90: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
aca0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
acb0: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
acc0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
acd0: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
ace0: 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
acf0: 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
ad00: 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
ad10: 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30  (((i64)0x0000100
ad20: 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
ad30: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a  64 i = pMem->i;.
ad40: 20 20 20 20 75 36 34 20 75 20 3d 20 69 3c 30 20      u64 u = i<0 
ad50: 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66  ? -i : i;.    if
ad60: 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
ad70: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
ad80: 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
ad90: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
ada0: 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
adb0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
adc0: 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
add0: 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
ade0: 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
adf0: 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
ae00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
ae10: 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
ae20: 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
ae30: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
ae40: 53 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Str ){.    int n
ae50: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
ae60: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
ae70: 20 20 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32      return ((n*2
ae80: 29 20 2b 20 31 33 29 3b 0a 20 20 7d 0a 20 20 69  ) + 13);.  }.  i
ae90: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  f( flags&MEM_Blo
aea0: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
aeb0: 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 32 29  (pMem->n*2 + 12)
aec0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
aee0: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
aef0: 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
af00: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
af10: 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
af20: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
af30: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
af40: 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
af50: 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
af60: 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
af70: 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
af80: 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
af90: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
afa0: 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
afb0: 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
afc0: 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
afd0: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
afe0: 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
aff0: 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
b000: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  }../*.** Write t
b010: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
b020: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
b030: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
b040: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
b050: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
b060: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
b070: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
b080: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
b090: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
b0a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
b0b0: 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69 6e 74 20  ritten..*/ .int 
b0c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
b0d0: 6c 50 75 74 28 75 6e 73 69 67 6e 65 64 20 63 68  lPut(unsigned ch
b0e0: 61 72 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d  ar *buf, Mem *pM
b0f0: 65 6d 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  em){.  u32 seria
b100: 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
b110: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
b120: 4d 65 6d 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Mem);.  int len;
b130: 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20  ..  /* NULL */. 
b140: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
b150: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
b160: 6e 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  n 0;.  }. .  /* 
b170: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
b180: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
b190: 5f 74 79 70 65 3c 3d 37 20 29 7b 0a 20 20 20 20  _type<=7 ){.    
b1a0: 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69  u64 v;.    int i
b1b0: 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
b1c0: 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
b1d0: 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d    v = *(u64*)&pM
b1e0: 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  em->r;.    }else
b1f0: 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75 36  {.      v = *(u6
b200: 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20  4*)&pMem->i;.   
b210: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
b220: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
b230: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
b240: 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c  _type);.    whil
b250: 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
b260: 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46  buf[i] = (v&0xFF
b270: 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
b280: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
b290: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 0a 20  rn len;.  }.  . 
b2a0: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
b2b0: 6f 62 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ob */.  assert( 
b2c0: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
b2d0: 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  );.  len = sqlit
b2e0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
b2f0: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
b300: 3b 0a 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  ;.  memcpy(buf, 
b310: 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
b320: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a   return len;.}..
b330: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
b340: 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
b350: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
b360: 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
b370: 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
b380: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
b390: 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
b3a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
b3b0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
b3c0: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
b3d0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
b3e0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
b3f0: 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
b400: 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
b410: 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
b420: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
b430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
b440: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
b450: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
b460: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
b490: 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
b4a0: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
b4b0: 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
b4c0: 7b 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  {.    case 8:   
b4d0: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
b4e0: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
b4f0: 20 20 20 63 61 73 65 20 39 3a 20 20 20 20 2f 2a     case 9:    /*
b500: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
b510: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
b520: 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
b530: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
b540: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
b550: 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
b560: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
b570: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
b580: 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
b590: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b5a0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
b5b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b5c0: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
b5d0: 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
b5e0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
b5f0: 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 73 69 67 6e   pMem->i = (sign
b600: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
b610: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b620: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
b630: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b640: 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
b650: 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
b660: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
b670: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 28 28     pMem->i = (((
b680: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
b690: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
b6a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
b6b0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
b6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
b6d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
b6e0: 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
b6f0: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
b700: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28       pMem->i = (
b710: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
b720: 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
b730: 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
b740: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
b750: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
b760: 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
b770: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
b780: 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
b790: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
b7a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
b7b0: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
b7c0: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
b7d0: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
b7e0: 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
b7f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
b800: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
b810: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b820: 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
b830: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
b840: 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
b850: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
b860: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
b870: 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
b880: 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
b890: 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
b8a0: 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
b8b0: 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
b8c0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
b8d0: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a 28 69     pMem->i = *(i
b8e0: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
b8f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b900: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
b910: 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
b920: 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
b930: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
b940: 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
b950: 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
b960: 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
b970: 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
b980: 75 33 32 20 79 3b 0a 23 69 66 6e 64 65 66 20 4e  u32 y;.#ifndef N
b990: 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 56  DEBUG.      /* V
b9a0: 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
b9b0: 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
b9c0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
b9d0: 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
b9e0: 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
b9f0: 20 54 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   The byte order 
ba00: 64 69 66 66 65 72 73 20 6f 6e 20 73 6f 6d 65 20  differs on some 
ba10: 28 62 72 6f 6b 65 6e 29 20 61 72 63 68 69 74 65  (broken) archite
ba20: 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20 2a 2f  ctures..      */
ba30: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
ba40: 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
ba50: 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
ba60: 33 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  32;.      assert
ba70: 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62 6c 65 2a  ( 1.0==*(double*
ba80: 29 26 74 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  )&t1 );.#endif..
ba90: 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30        x = (buf[0
baa0: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
bab0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
bac0: 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
bad0: 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c      y = (buf[4]<
bae0: 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c  <24) | (buf[5]<<
baf0: 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38  16) | (buf[6]<<8
bb00: 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20  ) | buf[7];.    
bb10: 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
bb20: 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  y;.      if( ser
bb30: 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
bb40: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d         pMem->i =
bb50: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
bb60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
bb70: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
bb80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bb90: 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f 75 62  pMem->r = *(doub
bba0: 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  le*)&x;.        
bbb0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bbc0: 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
bbd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
bbe0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
bbf0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  t: {.      int l
bc00: 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
bc10: 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
bc20: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
bc30: 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
bc40: 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
bc50: 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
bc60: 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
bc70: 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
bc80: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
bc90: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
bca0: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
bcb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
bcc0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
bcd0: 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
bce0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
bcf0: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
bd00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bd10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
bd20: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
bd30: 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
bd40: 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
bd50: 65 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 64  ecords specified
bd60: 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20   by .** {nKey1, 
bd70: 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79  pKey1} and {nKey
bd80: 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72  2, pKey2}, retur
bd90: 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c  ning a negative,
bda0: 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
bdb0: 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
bdc0: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69  {nKey1, pKey1} i
bdd0: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
bde0: 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
bdf0: 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32  ater than {nKey2
be00: 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20  , pKey2}.  Both 
be10: 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75  Key1 and Key2 mu
be20: 73 74 20 62 65 20 62 79 74 65 20 73 74 72 69 6e  st be byte strin
be30: 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62  gs.** composed b
be40: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
be50: 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
be60: 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73  e VDBE..*/.int s
be70: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
be80: 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
be90: 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74  *userData,.  int
bea0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
beb0: 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e  id *pKey1, .  in
bec0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
bed0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
bee0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
bef0: 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73  o = (KeyInfo*)us
bf00: 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31  erData;.  u32 d1
bf10: 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f  , d2;          /
bf20: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
bf30: 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
bf40: 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
bf50: 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20  32 idx1, idx2;  
bf60: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
bf70: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
bf80: 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
bf90: 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
bfa0: 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75  , szHdr2;  /* Nu
bfb0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
bfc0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
bfd0: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
bfe0: 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
bff0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
c000: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
c010: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
c020: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
c030: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
c040: 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20  d char *aKey2 = 
c050: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
c060: 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20  char *)pKey2;.. 
c070: 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d   Mem mem1;.  Mem
c080: 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e   mem2;.  mem1.en
c090: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
c0a0: 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20  c;.  mem2.enc = 
c0b0: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
c0c0: 20 0a 20 20 69 64 78 31 20 3d 20 73 71 6c 69 74   .  idx1 = sqlit
c0d0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b  e3GetVarint32(pK
c0e0: 65 79 31 2c 20 26 73 7a 48 64 72 31 29 3b 0a 20  ey1, &szHdr1);. 
c0f0: 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
c100: 69 64 78 32 20 3d 20 73 71 6c 69 74 65 33 47 65  idx2 = sqlite3Ge
c110: 74 56 61 72 69 6e 74 33 32 28 70 4b 65 79 32 2c  tVarint32(pKey2,
c120: 20 26 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20   &szHdr2);.  d2 
c130: 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65  = szHdr2;.  nFie
c140: 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
c150: 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
c160: 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
c170: 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20  dx2<szHdr2 ){.  
c180: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
c190: 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69  e1;.    u32 seri
c1a0: 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f  al_type2;..    /
c1b0: 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
c1c0: 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
c1d0: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
c1e0: 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
c1f0: 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
c200: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  GetVarint32(&aKe
c210: 79 31 5b 69 64 78 31 5d 2c 20 26 73 65 72 69 61  y1[idx1], &seria
c220: 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20 69 66  l_type1);.    if
c230: 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
c240: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
c250: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
c260: 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
c270: 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 73 71 6c  .    idx2 += sql
c280: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
c290: 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c 20 26 73  &aKey2[idx2], &s
c2a0: 65 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 20 20  erial_type2);.  
c2b0: 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20    if( d2>=nKey2 
c2c0: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
c2d0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
c2e0: 61 6c 5f 74 79 70 65 32 29 3e 30 20 29 20 62 72  al_type2)>0 ) br
c2f0: 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73  eak;..    /* Ass
c300: 65 72 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ert that there i
c310: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  s enough space l
c320: 65 66 74 20 69 6e 20 65 61 63 68 20 6b 65 79 20  eft in each key 
c330: 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a  for the blob of.
c340: 20 20 20 20 2a 2a 20 64 61 74 61 20 74 6f 20 67      ** data to g
c350: 6f 20 77 69 74 68 20 74 68 65 20 73 65 72 69 61  o with the seria
c360: 6c 20 74 79 70 65 20 6a 75 73 74 20 72 65 61 64  l type just read
c370: 2e 20 54 68 69 73 20 61 73 73 65 72 74 20 6d 61  . This assert ma
c380: 79 20 66 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a  y fail if.    **
c390: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
c3a0: 72 75 70 74 65 64 2e 20 20 54 68 65 6e 20 72 65  rupted.  Then re
c3b0: 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ad the value fro
c3c0: 6d 20 65 61 63 68 20 6b 65 79 20 69 6e 74 6f 20  m each key into 
c3d0: 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20  mem1.    ** and 
c3e0: 6d 65 6d 32 20 72 65 73 70 65 63 74 69 76 65 6c  mem2 respectivel
c3f0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  y..    */.    d1
c400: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
c410: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
c420: 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
c430: 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 64  1, &mem1);.    d
c440: 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  2 += sqlite3Vdbe
c450: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 32  SerialGet(&aKey2
c460: 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d2], serial_typ
c470: 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20  e2, &mem2);..   
c480: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
c490: 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
c4a0: 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20 3f  mem2, i<nField ?
c4b0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
c4c0: 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
c4d0: 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d  ( mem1.flags & M
c4e0: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
c4f0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
c500: 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20 6d  mem1);.    if( m
c510: 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em2.flags & MEM_
c520: 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  Dyn ) sqlite3Vdb
c530: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
c540: 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  2);.    if( rc!=
c550: 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
c560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
c570: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f  .  }..  /* One o
c580: 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
c590: 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62 75  ut of fields, bu
c5a0: 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  t all the fields
c5b0: 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
c5c0: 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75 61  t.  ** were equa
c5d0: 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b 65  l. If the incrKe
c5e0: 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  y flag is true, 
c5f0: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  then the second 
c600: 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65 61  key is.  ** trea
c610: 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a 20  ted as larger.. 
c620: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20   */.  if( rc==0 
c630: 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  ){.    if( pKeyI
c640: 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a  nfo->incrKey ){.
c650: 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
c660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 31 3c     }else if( d1<
c670: 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 72  nKey1 ){.      r
c680: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
c690: 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b   if( d2<nKey2 ){
c6a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
c6b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c6c0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
c6d0: 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
c6e0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20  Info->nField.   
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
c700: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
c710: 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
c720: 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
c730: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c740: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
c750: 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  is an index entr
c760: 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67  y composed using
c770: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
c780: 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68  rd opcode..** Th
c790: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
c7a0: 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75  this record shou
c7b0: 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
c7c0: 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a   (specifically.*
c7d0: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77  * an integer row
c7e0: 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  id).  This routi
c7f0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
c800: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
c810: 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65  n.** that intege
c820: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
c830: 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
c840: 28 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74  (int nKey, const
c850: 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
c860: 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
c870: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
c880: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
c890: 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
c8a0: 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
c8b0: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73  he rowid */..  s
c8c0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
c8d0: 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b  2(aKey, &szHdr);
c8e0: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
c8f0: 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64  int32(&aKey[szHd
c900: 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
c910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
c920: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
c930: 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
c940: 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  .}.  ../*.** pCu
c950: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
c960: 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
c970: 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
c980: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
c990: 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
c9a0: 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
c9b0: 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
c9c0: 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
c9d0: 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
c9e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c9f0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
ca00: 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
ca10: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
ca20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
ca30: 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75  dbeIdxRowid(BtCu
ca40: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
ca50: 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
ca60: 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72  CellKey;.  int r
ca70: 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
ca80: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ca90: 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
caa0: 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
cab0: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
cac0: 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
cad0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
cae0: 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
caf0: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
cb00: 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71   Mem m, v;..  sq
cb10: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
cb20: 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
cb30: 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
cb40: 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey<=0 ){.    ret
cb50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cb60: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
cb70: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
cb80: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
cb90: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
cba0: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
cbb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cbc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47  ;.  }.  sqlite3G
cbd0: 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
cbe0: 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  m.z, &szHdr);.  
cbf0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
cc00: 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
cc10: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69  dr-1], &typeRowi
cc20: 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d  d);.  lenRowid =
cc30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
cc40: 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
cc50: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
cc60: 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
cc70: 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
cc80: 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
cc90: 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
cca0: 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56   v.i;.  sqlite3V
ccb0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
ccc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ccd0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
cce0: 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
ccf0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
cd00: 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
cd10: 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
cd20: 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
cd30: 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
cd40: 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
cd50: 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
cd60: 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
cd70: 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
cd80: 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
cd90: 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
cda0: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
cdb0: 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
cdc0: 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
cdd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
cde0: 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
cdf0: 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72  Key is either cr
ce00: 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
ce10: 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
ce20: 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
ce30: 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
ce40: 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
ce50: 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
ce60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
ce70: 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
ce80: 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a  gnored as well..
ce90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
cea0: 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
ceb0: 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  .  Cursor *pC,  
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ced0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
cee0: 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
cef0: 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  */.  int nKey, c
cf00: 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20  onst u8 *pKey,  
cf10: 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63   /* The key to c
cf20: 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
cf30: 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
cf40: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
cf50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
cf60: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
cf70: 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
cf80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
cf90: 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
cfa0: 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e  C->pCursor;.  in
cfb0: 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65  t lenRowid;.  Me
cfc0: 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  m m;..  sqlite3B
cfd0: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
cfe0: 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
cff0: 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
d000: 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
d010: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d020: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
d030: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
d040: 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
d050: 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  ursor, 0, nCellK
d060: 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
d070: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
d080: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e  rn rc;.  }.  len
d090: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
d0a0: 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 6d  dbeIdxRowidLen(m
d0b0: 2e 6e 2c 20 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20  .n, (u8*)m.z);. 
d0c0: 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
d0d0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
d0e0: 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d  (pC->pKeyInfo, m
d0f0: 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a  .n-lenRowid, m.z
d100: 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
d110: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
d120: 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
d130: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d140: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d150: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
d160: 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
d170: 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
d180: 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
d190: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
d1a0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
d1b0: 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
d1c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d1d0: 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
d1e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
d1f0: 61 6e 67 65 29 7b 0a 20 20 64 62 2d 3e 6e 43 68  ange){.  db->nCh
d200: 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
d210: 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
d220: 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
d230: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
d240: 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
d250: 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
d260: 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
d270: 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
d280: 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
d290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d2a0: 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
d2b0: 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
d2c0: 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
d2d0: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
d2e0: 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
d2f0: 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
d300: 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
d310: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
d320: 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
d330: 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
d340: 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
d350: 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
d360: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
d370: 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
d380: 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
d390: 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
d3a0: 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
d3b0: 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
d3c0: 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
d3d0: 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
d3e0: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
d3f0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
d400: 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
d410: 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
d420: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
d430: 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
d440: 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
d450: 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
d460: 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
d470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d480: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
d490: 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
d4a0: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
d4b0: 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
d4c0: 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
d4d0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
d4e0: 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
d4f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d500: 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
d510: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
d520: 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
d530: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
d540: 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
d550: 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a              rn v->db;.}.