/ Hex Artifact Content
Login

Artifact f714ee9e91f1e47d4b6ae83798e0b263ffe224cc:


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 2f 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75   /* KeyInfo stru
31f0: 63 74 75 72 65 73 20 74 68 61 74 20 69 6e 63 6c  ctures that incl
3200: 75 64 65 20 61 6e 20 4b 65 79 49 6e 66 6f 2e 61  ude an KeyInfo.a
3210: 53 6f 72 74 4f 72 64 65 72 20 61 72 65 20 61 6c  SortOrder are al
3220: 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 65 6e 74  ways.    ** sent
3230: 20 69 6e 20 75 73 69 6e 67 20 50 33 5f 4b 45 59   in using P3_KEY
3240: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2e 20 20 54  INFO_HANDOFF.  T
3250: 68 65 20 4b 65 79 49 6e 66 6f 2e 61 53 6f 72 74  he KeyInfo.aSort
3260: 4f 72 64 65 72 20 61 72 72 61 79 0a 20 20 20 20  Order array.    
3270: 2a 2a 20 69 73 20 6e 6f 74 20 64 75 70 6c 69 63  ** is not duplic
3280: 61 74 65 64 20 77 68 65 6e 20 50 33 5f 4b 45 59  ated when P3_KEY
3290: 49 4e 46 4f 20 69 73 20 75 73 65 64 2e 20 2a 2f  INFO is used. */
32a0: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
32b0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
32c0: 72 64 65 72 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20  rder==0 ); */.  
32d0: 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79    nField = ((Key
32e0: 49 6e 66 6f 2a 29 7a 50 33 29 2d 3e 6e 46 69 65  Info*)zP3)->nFie
32f0: 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ld;.    nByte = 
3300: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
3310: 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73  ) + (nField-1)*s
3320: 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e  izeof(pKeyInfo->
3330: 61 43 6f 6c 6c 5b 30 5d 29 3b 0a 20 20 20 20 70  aColl[0]);.    p
3340: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
3350: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65  MallocRaw( nByte
3360: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   );.    pOp->p3 
3370: 3d 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  = (char*)pKeyInf
3380: 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  o;.    if( pKeyI
3390: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  nfo ){.      mem
33a0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
33b0: 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  3, nByte);.     
33c0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
33d0: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
33e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 2d  else{.      pOp-
33f0: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  >p3type = P3_NOT
3400: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
3410: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
3420: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
3430: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28  .    pOp->p3 = (
3440: 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70  char*)zP3;.    p
3450: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
3460: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
3470: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
3480: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
3490: 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP3;.    pOp->p
34a0: 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c  3type = n;.  }el
34b0: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  se{.    if( n==0
34c0: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50   ) n = strlen(zP
34d0: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20  3);.    pOp->p3 
34e0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
34f0: 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP3, n);.    pOp
3500: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
3510: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
3520: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3530: 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 50  ** Replace the P
3540: 33 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  3 field of the m
3550: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
3560: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  ed instruction w
3570: 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74  ith.** comment t
3580: 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ext..*/.void sql
3590: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
35a0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
35b0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
35c0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
35d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
35e0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
35f0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
3600: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
3610: 70 33 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  p3==0 || sqlite3
3620: 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
3630: 6c 65 64 20 29 3b 0a 20 20 76 61 5f 73 74 61 72  led );.  va_star
3640: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
3650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3660: 6e 67 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c  ngeP3(p, -1, sql
3670: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
3680: 72 6d 61 74 2c 20 61 70 29 2c 20 50 33 5f 44 59  rmat, ap), P3_DY
3690: 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f 65 6e 64  NAMIC);.  va_end
36a0: 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (ap);.}.#endif..
36b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
36c0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
36d0: 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a  ven address..*/.
36e0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
36f0: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
3700: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61  , int addr){.  a
3710: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3720: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
3740: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
3750: 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75 72 6e  >nOp );.  return
3760: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
3770: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
3780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
3790: 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  AIN) || !defined
37a0: 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20  (NDEBUG) \.     
37b0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
37c0: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
37d0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
37e0: 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  )./*.** Compute 
37f0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
3800: 73 63 72 69 62 65 73 20 74 68 65 20 50 33 20 70  scribes the P3 p
3810: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
3820: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
3830: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
3840: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
3850: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
3860: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
3870: 73 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c  splayP3(Op *pOp,
3880: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
3890: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
38a0: 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65 72 74 28   *zP3;.  assert(
38b0: 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20   nTemp>=20 );.  
38c0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 33 74  switch( pOp->p3t
38d0: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
38e0: 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P3_KEYINFO: {.  
38f0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
3900: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
3910: 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f  yInfo = (KeyInfo
3920: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
3930: 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20   sprintf(zTemp, 
3940: 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b  "keyinfo(%d", pK
3950: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
3960: 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65  .      i = strle
3970: 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  n(zTemp);.      
3980: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
3990: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
39a0: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
39b0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
39c0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
39d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
39e0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
39f0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43  nt n = strlen(pC
3a00: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
3a10: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
3a20: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
3a30: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 54        strcpy(&zT
3a40: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 29 3b 0a  emp[i],",...");.
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3a60: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
3a70: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
3a80: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
3a90: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
3aa0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
3ab0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
3ac0: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
3ad0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
3ae0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
3af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b00: 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  strcpy(&zTemp[i]
3b10: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
3b20: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
3b30: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
3b40: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
3b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
3b60: 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  rcpy(&zTemp[i],"
3b70: 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20 20 20  ,nil");.        
3b80: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
3b90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3ba0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
3bb0: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
3bc0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
3bd0: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
3be0: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
3bf0: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
3c00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3c10: 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P3_COLLSEQ: {.  
3c20: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3c30: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 2a 29 70  ll = (CollSeq*)p
3c40: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 70  Op->p3;.      sp
3c50: 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 63 6f  rintf(zTemp, "co
3c60: 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70  llseq(%.20s)", p
3c70: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
3c80: 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b      zP3 = zTemp;
3c90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ca0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33 5f    }.    case P3_
3cb0: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
3cc0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
3cd0: 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70 2d 3e   (FuncDef*)pOp->
3ce0: 70 33 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  p3;.      char z
3cf0: 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Num[30];.      s
3d00: 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 25  printf(zTemp, "%
3d10: 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c 20 70 44 65  .*s", nTemp, pDe
3d20: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  f->zName);.     
3d30: 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d 2c 22 28   sprintf(zNum,"(
3d40: 25 64 29 22 2c 20 70 44 65 66 2d 3e 6e 41 72 67  %d)", pDef->nArg
3d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
3d60: 6c 65 6e 28 7a 54 65 6d 70 29 2b 73 74 72 6c 65  len(zTemp)+strle
3d70: 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e 54 65 6d 70  n(zNum)+1<=nTemp
3d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63   ){.        strc
3d90: 61 74 28 7a 54 65 6d 70 2c 20 7a 4e 75 6d 29 3b  at(zTemp, zNum);
3da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
3db0: 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P3 = zTemp;.    
3dc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3dd0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
3de0: 20 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70      zP3 = pOp->p
3df0: 33 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 33  3;.      if( zP3
3e00: 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  ==0 || pOp->opco
3e10: 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  de==OP_Noop ){. 
3e20: 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22 3b         zP3 = "";
3e30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3e40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b   }.  return zP3;
3e50: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  .}.#endif...#if 
3e60: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
3e70: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
3e80: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
3e90: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
3ea0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
3eb0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3ec0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
3ed0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
3ee0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
3ef0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
3f00: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
3f10: 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68   char *zP3;.  ch
3f20: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
3f30: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3f40: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
3f50: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
3f60: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
3f70: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
3f80: 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69  dout;.  zP3 = di
3f90: 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50 74  splayP3(pOp, zPt
3fa0: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
3fb0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
3fc0: 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20  , zFormat1,.    
3fd0: 20 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63    pc, sqlite3Opc
3fe0: 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70  odeNames[pOp->op
3ff0: 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20  code], pOp->p1, 
4000: 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20  pOp->p2, zP3);. 
4010: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
4020: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
4030: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
4040: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
4050: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
4060: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
4070: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
4080: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
4090: 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a  while( N-->0 ){.
40a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
40b0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29  eMemRelease(p++)
40c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
40d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
40e0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
40f0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
4100: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
4110: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
4120: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
4130: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
4140: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
4150: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
4160: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
4170: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
4180: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
4190: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
41a0: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
41b0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
41c0: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
41d0: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
41e0: 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IN"..*/.int sqli
41f0: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
4200: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
4210: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4220: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  VDBE */.){.  sql
4230: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4240: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4250: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4260: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
4270: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
4280: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
4290: 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72  AGIC_RUN ) retur
42a0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
42b0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
42c0: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
42d0: 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73  IC_BUSY );.  ass
42e0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
42f0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
4300: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a  SQLITE_BUSY );..
4310: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
4320: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
4330: 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d 69  s not put dynami
4340: 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74  c strings onto t
4350: 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  he.  ** the stac
4360: 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65 63 6f  k, they may beco
4370: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
4380: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
4390: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
43a0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
43b0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
43c0: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
43d0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ing..  */.  if( 
43e0: 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61 53 74  p->pTos==&p->aSt
43f0: 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20 72 65  ack[4] ){.    re
4400: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
4410: 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20 20 7d  >aStack, 5);.  }
4420: 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b  .  p->resOnStack
4430: 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20   = 0;..  do{.   
4440: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
4450: 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70  }while( i<p->nOp
4460: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
4470: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
4480: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
4490: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  n );.  if( i>=p-
44a0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72  >nOp ){.    p->r
44b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
44c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
44d0: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
44e0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
44f0: 49 54 45 5f 49 6e 74 65 72 72 75 70 74 20 29 7b  ITE_Interrupt ){
4500: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  .    db->flags &
4510: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 72  = ~SQLITE_Interr
4520: 75 70 74 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  upt;.    p->rc =
4530: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
4540: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
4550: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
4560: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
4570: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  p->zErrMsg, sqli
4580: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
4590: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d  , (char*)0);.  }
45a0: 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  else{.    Op *pO
45b0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
45c0: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
45d0: 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20 70  p->aStack;.    p
45e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
45f0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
4600: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
4610: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d  TEGER;.    pMem-
4620: 3e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  >i = i;         
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
4650: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
4660: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
4670: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
4680: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
4690: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65  EM_Term;.    pMe
46a0: 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 4f 70  m->z = sqlite3Op
46b0: 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f  codeNames[pOp->o
46c0: 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f  pcode];  /* Opco
46d0: 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  de */.    pMem->
46e0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
46f0: 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  >z);.    pMem->t
4700: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
4710: 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  T;.    pMem->enc
4720: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
4730: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
4740: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
4750: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
4760: 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  ->i = pOp->p1;  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
4790: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
47a0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
47b0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
47c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
47d0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
47e0: 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  em->i = pOp->p2;
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
4810: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
4820: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
4830: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
4840: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
4850: 20 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c 4d 45 4d   = MEM_Short|MEM
4860: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20  _Str|MEM_Term;  
4870: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
4880: 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50  em->z = displayP
4890: 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68  3(pOp, pMem->zSh
48a0: 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d  ort, sizeof(pMem
48b0: 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20  ->zShort));.    
48c0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
48d0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
48e0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
48f0: 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e  _UTF8;..    p->n
4900: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20  ResColumn = 5 - 
4910: 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  2*(p->explain-1)
4920: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
4930: 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  pMem;.    p->rc 
4940: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4950: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
4960: 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
4970: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
4980: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
4990: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
49a0: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  T_EXPLAIN */../*
49b0: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
49c0: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
49d0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
49e0: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
49f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
4a00: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
4a10: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
4a20: 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70 20  DEBUG.  int nOp 
4a30: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
4a40: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
4a50: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
4a60: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
4a70: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
4a80: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
4a90: 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20  p && pOp->p3!=0 
4aa0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
4ab0: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  r *z = pOp->p3;.
4ac0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
4ad0: 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b  ce(*(u8*)z) ) z+
4ae0: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
4af0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
4b00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
4b10: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
4b20: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
4b30: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
4b40: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
4b50: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
4b60: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
4b70: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
4b80: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
4b90: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
4ba0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
4bb0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
4bc0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
4bd0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
4be0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
4bf0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
4c00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
4c10: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
4c20: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
4c30: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4c40: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
4c50: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
4c60: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
4c70: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
4ca0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4cd0: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
4ce0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
4cf0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4d20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
4d30: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
4d40: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d60: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
4d70: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
4d80: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
4db0: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
4dc0: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
4dd0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61  ){.  int n;..  a
4de0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4df0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4e00: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
4e10: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
4e20: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
4e30: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
4e40: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
4e50: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
4e60: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
4e70: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
4e80: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
4e90: 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73  than later. This
4ea0: 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73 65  .   * is because
4eb0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73   the call to res
4ec0: 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c  izeOpArray() bel
4ed0: 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68  ow may shrink th
4ee0: 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20  e.   * p->aOp[] 
4ef0: 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65  array to save me
4f00: 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77  mory if called w
4f10: 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49  hen in VDBE_MAGI
4f20: 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74  C_RUN .   * stat
4f30: 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61  e..   */.  p->ma
4f40: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
4f50: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69  _RUN;..  /* No i
4f60: 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20  nstruction ever 
4f70: 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e  pushes more than
4f80: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
4f90: 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  t onto the.  ** 
4fa0: 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20  stack.  And the 
4fb0: 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77  stack never grow
4fc0: 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20  s on successive 
4fd0: 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68  executions of th
4fe0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70  e.  ** same loop
4ff0: 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20  .  So the total 
5000: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75  number of instru
5010: 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70  ctions is an upp
5020: 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e  er bound.  ** on
5030: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61   the maximum sta
5040: 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72 65  ck depth require
5050: 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65 72  d.  (Added later
5060: 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73  :)  The.  ** res
5070: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20 63  olveP2Values() c
5080: 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74  all computes a t
5090: 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f 75  ighter upper bou
50a0: 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73  nd on the.  ** s
50b0: 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a  tack size..  **.
50c0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20    ** Allocation 
50d0: 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70  all the stack sp
50e0: 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72  ace we will ever
50f0: 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   need..  */.  if
5100: 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29  ( p->aStack==0 )
5110: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20  {.    int nArg; 
5120: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
5130: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
5140: 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72  passed to a user
5150: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
5160: 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20    int nStack;   
5170: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
5180: 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74  ber of stack ent
5190: 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f  ries required */
51a0: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
51b0: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26  lues(p, &nArg, &
51c0: 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73  nStack);.    res
51d0: 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d  izeOpArray(p, p-
51e0: 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72  >nOp);.    asser
51f0: 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20  t( nVar>=0 );.  
5200: 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b    assert( nStack
5210: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 6e  <p->nOp );.    n
5220: 53 74 61 63 6b 20 3d 20 69 73 45 78 70 6c 61 69  Stack = isExplai
5230: 6e 20 3f 20 31 30 20 3a 20 6e 53 74 61 63 6b 3b  n ? 10 : nStack;
5240: 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d  .    p->aStack =
5250: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 0a 20   sqliteMalloc(. 
5260: 20 20 20 20 20 20 20 6e 53 74 61 63 6b 2a 73 69         nStack*si
5270: 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30  zeof(p->aStack[0
5280: 5d 29 20 20 20 20 2f 2a 20 61 53 74 61 63 6b 20  ])    /* aStack 
5290: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a  */.      + nArg*
52a0: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20  sizeof(Mem*)    
52b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41            /* apA
52c0: 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56  rg */.      + nV
52d0: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  ar*sizeof(Mem)  
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52f0: 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aVar */.      + 
5300: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72  nVar*sizeof(char
5310: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  *)             /
5320: 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20  * azVar */.     
5330: 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d   + nMem*sizeof(M
5340: 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20  em)             
5350: 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20    /* aMem */.   
5360: 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a     + nCursor*siz
5370: 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 20 20 20  eof(Cursor*)    
5380: 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a      /* apCsr */.
5390: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
53a0: 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61  sqlite3Tsd()->ma
53b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
53c0: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26 70      p->aMem = &p
53d0: 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b 5d  ->aStack[nStack]
53e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  ;.      p->nMem 
53f0: 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 2d  = nMem;.      p-
5400: 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d  >aVar = &p->aMem
5410: 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70 2d  [nMem];.      p-
5420: 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20  >nVar = nVar;.  
5430: 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30      p->okVar = 0
5440: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67  ;.      p->apArg
5450: 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56   = (Mem**)&p->aV
5460: 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20  ar[nVar];.      
5470: 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72  p->azVar = (char
5480: 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72  **)&p->apArg[nAr
5490: 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  g];.      p->apC
54a0: 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26  sr = (Cursor**)&
54b0: 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a  p->azVar[nVar];.
54c0: 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72        p->nCursor
54d0: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
54e0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
54f0: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; n++){.       
5500: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
5510: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
5520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5530: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e    for(n=0; n<p->
5540: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
5550: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
5560: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d   = MEM_Null;.  }
5570: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5580: 44 45 42 55 47 0a 20 20 69 66 28 20 28 70 2d 3e  DEBUG.  if( (p->
5590: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
55a0: 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 21  TE_VdbeListing)!
55b0: 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74 65  =0.    || sqlite
55c0: 33 4f 73 2e 78 46 69 6c 65 45 78 69 73 74 73 28  3Os.xFileExists(
55d0: 22 76 64 62 65 5f 65 78 70 6c 61 69 6e 22 29 0a  "vdbe_explain").
55e0: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
55f0: 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45      printf("VDBE
5600: 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67   Program Listing
5610: 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  :\n");.    sqlit
5620: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70  e3VdbePrintSql(p
5630: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5640: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
5650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5660: 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c  ePrintOp(stdout,
5670: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
5680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5690: 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 69 6c 65   sqlite3Os.xFile
56a0: 45 78 69 73 74 73 28 22 76 64 62 65 5f 74 72 61  Exists("vdbe_tra
56b0: 63 65 22 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74  ce") ){.    p->t
56c0: 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20  race = stdout;. 
56d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
56e0: 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Tos = &p->aStack
56f0: 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20  [-1];.  p->pc = 
5700: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
5710: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e  LITE_OK;.  p->un
5720: 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70  iqueCnt = 0;.  p
5730: 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20  ->returnDepth = 
5740: 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  0;.  p->errorAct
5750: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
5760: 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20    p->popStack = 
5770: 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e   0;.  p->explain
5780: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
5790: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
57a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
57b0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 23 69  >nChange = 0;.#i
57c0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
57d0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
57e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
57f0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
5800: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
5810: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
5820: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
5830: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
5840: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
5850: 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20  se a cursor and 
5860: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
5870: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
5880: 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a  ursor happens.**
5890: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
58a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
58b0: 65 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20 2a  eCursor(Cursor *
58c0: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
58d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
58e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
58f0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
5900: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
5910: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
5920: 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rsor);.  }.  if(
5930: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
5940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
5950: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
5960: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
5970: 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71  Cx->pData);.  sq
5980: 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 61 54  liteFree(pCx->aT
5990: 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ype);.  sqliteFr
59a0: 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(pCx);.}../*.*
59b0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
59c0: 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ors.*/.static vo
59d0: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
59e0: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
59f0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
5a00: 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
5a10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5a20: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
5a30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5a40: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 61 70  FreeCursor(p->ap
5a50: 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20 70 2d 3e  Csr[i]);.    p->
5a60: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
5a70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
5a80: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
5a90: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
5aa0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
5ab0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
5ac0: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
5ad0: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
5ae0: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
5af0: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
5b00: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
5b10: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
5b20: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
5b30: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
5b40: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
5b50: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
5b60: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
5b70: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b  if( p->aStack ){
5b80: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
5b90: 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20  rray(p->aStack, 
5ba0: 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70  1 + (p->pTos - p
5bb0: 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20  ->aStack));.    
5bc0: 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53  p->pTos = &p->aS
5bd0: 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20  tack[-1];.  }.  
5be0: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
5bf0: 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  p);.  releaseMem
5c00: 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70  Array(p->aMem, p
5c10: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ->nMem);.  sqlit
5c20: 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28  e3VdbeFifoClear(
5c30: 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66  &p->sFifo);.  if
5c40: 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  ( p->contextStac
5c50: 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  k ){.    for(i=0
5c60: 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ; i<p->contextSt
5c70: 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20  ackTop; i++){.  
5c80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
5c90: 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e  ifoClear(&p->con
5ca0: 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69  textStack[i].sFi
5cb0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  fo);.    }.    s
5cc0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 63 6f 6e  qliteFree(p->con
5cd0: 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a  textStack);.  }.
5ce0: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
5cf0: 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  k = 0;.  p->cont
5d00: 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20  extStackDepth = 
5d10: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
5d20: 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73  tackTop = 0;.  s
5d30: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72  qliteFree(p->zEr
5d40: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
5d50: 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Msg = 0;.}../*.*
5d60: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
5d70: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
5d80: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
5d90: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
5da0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
5db0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
5dc0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
5dd0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
5de0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
5df0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
5e00: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
5e10: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
5e20: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
5e30: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
5e40: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
5e50: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
5e60: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
5e70: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
5e80: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
5e90: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
5ea0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
5eb0: 74 20 6e 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  t n;.  releaseMe
5ec0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
5ed0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
5ee0: 6e 2a 32 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  n*2);.  sqliteFr
5ef0: 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  ee(p->aColName);
5f00: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
5f10: 6e 2a 32 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  n*2;.  p->nResCo
5f20: 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  lumn = nResColum
5f30: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
5f40: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
5f50: 65 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  em*)sqliteMalloc
5f60: 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  ( sizeof(Mem)*n 
5f70: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
5f80: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
5f90: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
5fa0: 20 30 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c 4e   0 ){.    (pColN
5fb0: 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d 20  ame++)->flags = 
5fc0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a  MEM_Null;.  }.}.
5fd0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
5fe0: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
5ff0: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
6000: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
6010: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
6020: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
6030: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
6040: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
6050: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
6060: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
6070: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
6080: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
6090: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
60a0: 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43   If N==P3_STATIC
60b0: 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20    it means that 
60c0: 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74  zName is a point
60d0: 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74  er to a constant
60e0: 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e   static.** strin
60f0: 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73  g and we can jus
6100: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
6110: 65 72 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f  er. If it is P3_
6120: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a  DYNAMIC, then .*
6130: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
6140: 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69  freed using sqli
6150: 74 65 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  teFree() when th
6160: 65 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68  e vdbe is finish
6170: 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f  ed with.** it. O
6180: 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65  therwise, N byte
6190: 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63  s of zName are c
61a0: 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  opied..*/.int sq
61b0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
61c0: 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ame(Vdbe *p, int
61d0: 20 69 64 78 2c 20 63 6f 6e 73 74 20 63 68 61 72   idx, const char
61e0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b   *zName, int N){
61f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
6200: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73   *pColName;.  as
6210: 73 65 72 74 28 20 69 64 78 3c 28 32 2a 70 2d 3e  sert( idx<(2*p->
6220: 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29 3b 0a 20  nResColumn) );. 
6230: 20 69 66 28 20 73 71 6c 69 74 65 33 54 73 64 28   if( sqlite3Tsd(
6240: 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
6250: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6260: 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28  NOMEM;.  assert(
6270: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
6280: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
6290: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
62a0: 78 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33  x]);.  if( N==P3
62b0: 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50  _DYNAMIC || N==P
62c0: 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20  3_STATIC ){.    
62d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
62e0: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
62f0: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
6300: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
6310: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  TE_STATIC);.  }e
6320: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
6330: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
6340: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
6350: 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54  me, N, SQLITE_UT
6360: 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  F8,SQLITE_TRANSI
6370: 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ENT);.  }.  if( 
6380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6390: 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29   N==P3_DYNAMIC )
63a0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
63b0: 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d  flags = (pColNam
63c0: 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53  e->flags&(~MEM_S
63d0: 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b  tatic))|MEM_Dyn;
63e0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78  .    pColName->x
63f0: 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Del = 0;.  }.  r
6400: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6410: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
6420: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
6430: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
6440: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
6450: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
6460: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
6470: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
6480: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
6490: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
64a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
64b0: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
64c0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
64d0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
64e0: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
64f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6500: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
6510: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
6520: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
6530: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6540: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
6550: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
6560: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
6570: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
6580: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
6590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
65a0: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
65b0: 69 74 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  it = 0;..  for(i
65c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
65d0: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
65e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
65f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
6600: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
6610: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
6620: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
6630: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
6640: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
6650: 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ns++;.    }.  }.
6660: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
6670: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
6680: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
6690: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
66a0: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
66b0: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
66c0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
66d0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  back ){.    int 
66e0: 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rc;.    sqlite3S
66f0: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
6700: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
6710: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
6720: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
6730: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
6740: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  db);.    if( rc 
6750: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6760: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
6770: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
6780: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
6790: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
67a0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
67b0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
67c0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
67d0: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
67e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
67f0: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
6800: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
6810: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
6820: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
6830: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
6840: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
6850: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
6860: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
6870: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
6880: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
6890: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
68a0: 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ry:.  In that ca
68b0: 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f  se we do.  ** no
68c0: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
68d0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
68e0: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
68f0: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
6900: 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a  .  ** too..  */.
6910: 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28    if( 0==strlen(
6920: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
6930: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
6940: 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61  0].pBt)) || nTra
6950: 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  ns<=1 ){.    for
6960: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
6970: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
6980: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
6990: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
69a0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
69b0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
69c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
69d0: 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20  3BtreeSync(pBt, 
69e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
69f0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
6a00: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
6a10: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
6a20: 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
6a30: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  d */.    if( rc=
6a40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6a50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
6a60: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6a70: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
6a80: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6a90: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
6aa0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
6ab0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
6ac0: 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  it(pBt);.       
6ad0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6ae0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
6af0: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
6b00: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
6b10: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
6b20: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
6b30: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
6b40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6b50: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
6b60: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6b70: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
6b80: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
6b90: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6ba0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
6bb0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65  lse{.    int nee
6bc0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
6bd0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
6be0: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
6bf0: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
6c00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
6c10: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
6c20: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
6c30: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
6c40: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
6c50: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74      OsFile *mast
6c60: 65 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  er = 0;..    /* 
6c70: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
6c80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
6c90: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
6ca0: 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a      u32 random;.
6cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
6cc0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
6cd0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
6ce0: 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  ss(sizeof(random
6cf0: 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20  ), &random);.   
6d00: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
6d10: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2d  ite3MPrintf("%s-
6d20: 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69  mj%08X", zMainFi
6d30: 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66  le, random&0x7ff
6d40: 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66  fffff);.      if
6d50: 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !zMaster ){.  
6d60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6d70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6d80: 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73   }.    }while( s
6d90: 71 6c 69 74 65 33 4f 73 2e 78 46 69 6c 65 45 78  qlite3Os.xFileEx
6da0: 69 73 74 73 28 7a 4d 61 73 74 65 72 29 20 29 3b  ists(zMaster) );
6db0: 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
6dc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6dd0: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
6de0: 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e 45 78 63  lite3Os.xOpenExc
6df0: 6c 75 73 69 76 65 28 7a 4d 61 73 74 65 72 2c 20  lusive(zMaster, 
6e00: 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  &master, 0);.   
6e10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6e20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
6e30: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
6e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
6e50: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
6e60: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
6e70: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
6e80: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
6e90: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
6ea0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
6eb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6ec0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
6ed0: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
6ee0: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
6ef0: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
6f00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
6f10: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
6f20: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
6f30: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
6f40: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
6f50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6f60: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
6f70: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
6f80: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
6f90: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
6fa0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
6fb0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
6fc0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
6fd0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
6fe0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
6ff0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
7000: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
7010: 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  ;   /* Ignore th
7020: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
7030: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
7040: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
7050: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
7060: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
7070: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
7080: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
7090: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
70a0: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
70b0: 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [0]==0 ) continu
70c0: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d  e;  /* Ignore :m
70d0: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
70e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
70f0: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
7100: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
7110: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
7120: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
7130: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
7140: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7150: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 6d 61 73  lite3OsWrite(mas
7160: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c  ter, zFile, strl
7170: 65 6e 28 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20  en(zFile)+1);.  
7180: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
7190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
71a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
71b0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
71c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
71d0: 73 2e 78 44 65 6c 65 74 65 28 7a 4d 61 73 74 65  s.xDelete(zMaste
71e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
71f0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
7200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
7210: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
7220: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7230: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
7240: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7250: 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 64 6f   file. Before do
7260: 69 6e 67 20 74 68 69 73 2c 20 6f 70 65 6e 20 74  ing this, open t
7270: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20  he directory.   
7280: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
7290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
72a0: 74 6f 72 65 20 69 6e 20 73 6f 20 74 68 61 74 20  tore in so that 
72b0: 69 74 20 67 65 74 73 20 73 79 6e 63 65 64 20 74  it gets synced t
72c0: 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  oo..    */.    z
72d0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
72e0: 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d  e3BtreeGetDirnam
72f0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
7300: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
7310: 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
7320: 72 79 28 6d 61 73 74 65 72 2c 20 7a 4d 61 69 6e  ry(master, zMain
7330: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
7340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  c!=SQLITE_OK ||.
7350: 20 20 20 20 20 20 20 20 20 20 28 6e 65 65 64 53            (needS
7360: 79 6e 63 20 26 26 20 28 72 63 3d 73 71 6c 69 74  ync && (rc=sqlit
7370: 65 33 4f 73 53 79 6e 63 28 6d 61 73 74 65 72 2c  e3OsSync(master,
7380: 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  0))!=SQLITE_OK) 
7390: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
73a0: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
73b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
73c0: 73 2e 78 44 65 6c 65 74 65 28 7a 4d 61 73 74 65  s.xDelete(zMaste
73d0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
73e0: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
73f0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
7400: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
7410: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
7420: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
7430: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
7440: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
7450: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
7460: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
7470: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
7480: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
7490: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
74a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
74b0: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
74c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
74d0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
74e0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
74f0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
7500: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
7510: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
7520: 53 79 6e 63 28 29 2c 0a 20 20 20 20 2a 2a 20 74  Sync(),.    ** t
7530: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
7540: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6d  hance that the m
7550: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7560: 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  le will be.    *
7570: 2a 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  * orphaned. But 
7580: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
7590: 20 69 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65   it, in case the
75a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
75b0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65      ** file name
75c0: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
75d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
75e0: 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
75f0: 69 6c 75 72 65 0a 20 20 20 20 2a 2a 20 6f 63 63  ilure.    ** occ
7600: 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ured..    */.   
7610: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
7620: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
7630: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7640: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7650: 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20       if( pBt && 
7660: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
7670: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
7680: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7690: 65 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c  e3BtreeSync(pBt,
76a0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
76b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
76c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
76d0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
76e0: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
76f0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7700: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
7710: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7720: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7730: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7740: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65  e3OsClose(&maste
7750: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65  r);..    /* Dele
7760: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
7770: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
7780: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
7790: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
77a0: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
77b0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
77c0: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
77d0: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
77e0: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
77f0: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
7800: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
7810: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
7820: 74 65 33 4f 73 2e 78 44 65 6c 65 74 65 28 7a 4d  te3Os.xDelete(zM
7830: 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
7840: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
7850: 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  K );.    sqliteF
7860: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
7870: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
7880: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7890: 73 2e 78 53 79 6e 63 44 69 72 65 63 74 6f 72 79  s.xSyncDirectory
78a0: 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
78b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
78c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
78d0: 68 69 73 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e  his is not good.
78e0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
78f0: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
7900: 6e 20 64 65 6c 65 74 65 64 2c 20 62 75 74 0a 20  n deleted, but. 
7910: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 72 65       ** the dire
7920: 63 74 6f 72 79 20 73 79 6e 63 20 66 61 69 6c 65  ctory sync faile
7930: 64 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63  d. There is no c
7940: 6f 6d 70 6c 65 74 65 6c 79 20 73 61 66 65 20 63  ompletely safe c
7950: 6f 75 72 73 65 20 6f 66 0a 20 20 20 20 20 20 2a  ourse of.      *
7960: 2a 20 61 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65  * action from he
7970: 72 65 2e 20 54 68 65 20 69 6e 64 69 76 69 64 75  re. The individu
7980: 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74  al journals cont
7990: 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ain the name of 
79a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73  the.      ** mas
79b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
79c0: 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e  , but there is n
79d0: 6f 20 77 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67  o way of knowing
79e0: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
79f0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
7a00: 20 65 78 69 73 74 73 20 6e 6f 77 20 6f 72 20 69   exists now or i
7a10: 66 20 69 74 20 77 69 6c 6c 20 65 78 69 73 74 20  f it will exist 
7a20: 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
7a30: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 73 79 73  ing.      ** sys
7a40: 74 65 6d 20 63 72 61 73 68 20 74 68 61 74 20 6d  tem crash that m
7a50: 61 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73  ay follow the fs
7a60: 79 6e 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20  ync() failure.. 
7a70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
7a80: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
7a90: 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
7aa0: 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
7ab0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
7ac0: 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
7ad0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
7ae0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
7af0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
7b00: 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
7b10: 67 20 66 69 6c 65 73 20 61 6e 64 20 64 65 6c 65  g files and dele
7b20: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  ting.    ** jour
7b30: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
7b40: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
7b50: 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
7b60: 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 0a 20  ening we don't. 
7b70: 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20 63 61 72     ** really car
7b80: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
7b90: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
7ba0: 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
7bb0: 75 61 72 61 6e 74 65 65 64 2c 0a 20 20 20 20 2a  uaranteed,.    *
7bc0: 2a 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  * but some stray
7bd0: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
7be0: 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
7bf0: 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
7c00: 61 6e 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  an.    ** error 
7c10: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
7c20: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
7c30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
7c40: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
7c50: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
7c60: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7c70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
7c80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7c90: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42  e3BtreeCommit(pB
7ca0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
7cb0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
7cc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7cd0: 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72 79 20 61  .** Find every a
7ce0: 63 74 69 76 65 20 56 4d 20 6f 74 68 65 72 20 74  ctive VM other t
7cf0: 68 61 6e 20 70 56 64 62 65 20 61 6e 64 20 63 68  han pVdbe and ch
7d00: 61 6e 67 65 20 69 74 73 20 73 74 61 74 75 73 20  ange its status 
7d10: 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64 2e 20 20  to.** aborted.  
7d20: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
7d30: 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73 65 73 20  n one VM causes 
7d40: 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75 65 20 74  a rollback due t
7d50: 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c  o an.** ON CONFL
7d60: 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20 63 6c 61  ICT ROLLBACK cla
7d70: 75 73 65 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  use (for example
7d80: 29 2e 20 20 54 68 65 20 6f 74 68 65 72 20 56 4d  ).  The other VM
7d90: 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61 62 6f  s must be.** abo
7da0: 72 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  rted so that the
7db0: 79 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 64 61  y do not have da
7dc0: 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74 20 66 72  ta rolled out fr
7dd0: 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68 0a 2a 2a  om underneath.**
7de0: 20 74 68 65 6d 20 6c 65 61 64 69 6e 67 20 74 6f   them leading to
7df0: 20 61 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a   a segfault..*/.
7e00: 73 74 61 74 69 63 20 76 6f 69 64 20 61 62 6f 72  static void abor
7e10: 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65  tOtherActiveVdbe
7e20: 73 28 56 64 62 65 20 2a 70 56 64 62 65 29 7b 0a  s(Vdbe *pVdbe){.
7e30: 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72 3b 0a    Vdbe *pOther;.
7e40: 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 70 56 64    for(pOther=pVd
7e50: 62 65 2d 3e 64 62 2d 3e 70 56 64 62 65 3b 20 70  be->db->pVdbe; p
7e60: 4f 74 68 65 72 3b 20 70 4f 74 68 65 72 3d 70 4f  Other; pOther=pO
7e70: 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ther->pNext){.  
7e80: 20 20 69 66 28 20 70 4f 74 68 65 72 3d 3d 70 56    if( pOther==pV
7e90: 64 62 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dbe ) continue;.
7ea0: 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 2d 3e      if( pOther->
7eb0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
7ec0: 43 5f 52 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d  C_RUN || pOther-
7ed0: 3e 70 63 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  >pc<0 ) continue
7ee0: 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75  ;.    closeAllCu
7ef0: 72 73 6f 72 73 28 70 4f 74 68 65 72 29 3b 0a 20  rsors(pOther);. 
7f00: 20 20 20 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74     pOther->abort
7f10: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
7f20: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
7f30: 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
7f40: 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76  he sqlite3.activ
7f50: 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76  eVdbeCnt count v
7f60: 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
7f70: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
7f80: 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
7f90: 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
7fa0: 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
7fb0: 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
7fc0: 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
7fd0: 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
7fe0: 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
7ff0: 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
8000: 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
8010: 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
8020: 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
8030: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
8040: 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
8050: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
8060: 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
8070: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
8080: 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
8090: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
80a0: 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
80b0: 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
80c0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20  nt cnt = 0;.  p 
80d0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
80e0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
80f0: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
8100: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
8110: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
8120: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
8130: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
8140: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
8150: 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t==db->activeVdb
8160: 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  eCnt );.}.#else.
8170: 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
8180: 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
8190: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
81a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
81b0: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
81c0: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
81d0: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
81e0: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
81f0: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
8200: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
8210: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
8220: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
8230: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
8240: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
8250: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
8260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8270: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
8280: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
8290: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
82a0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
82b0: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
82c0: 43 5f 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65  C_HALT..**.** Re
82d0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
82e0: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
82f0: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
8300: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
8310: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
8320: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
8330: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
8340: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
8350: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
8360: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
8370: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
8380: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
8390: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
83a0: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
83b0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
83c0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
83d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46  nt i;.  int (*xF
83e0: 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29  unc)(Btree *pBt)
83f0: 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69   = 0;  /* Functi
8400: 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61  on to call on ea
8410: 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64  ch btree backend
8420: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
8430: 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46  e3Tsd()->mallocF
8440: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
8450: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8460: 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  M;.  }..  if( p-
8470: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
8480: 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 2f 2a  IC_RUN ){.    /*
8490: 20 41 6c 72 65 61 64 79 20 68 61 6c 74 65 64 2e   Already halted.
84a0: 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e    Nothing to do.
84b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
84c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
84d0: 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a 20 20 20  AGIC_HALT );.   
84e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
84f0: 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  K;.  }.  closeAl
8500: 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 63  lCursors(p);.  c
8510: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
8520: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
8530: 70 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  pc<0 ){.    /* N
8540: 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
8550: 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
8560: 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
8570: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 7d 65   started */.  }e
8580: 6c 73 65 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  lse if( db->auto
8590: 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63  Commit && db->ac
85a0: 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29  tiveVdbeCnt==1 )
85b0: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  {..    if( p->rc
85c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
85d0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
85e0: 4f 45 5f 46 61 69 6c 20 26 26 20 70 2d 3e 72 63  OE_Fail && p->rc
85f0: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 29  !=SQLITE_NOMEM))
8600: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  {.      /* The a
8610: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
8620: 69 73 20 74 72 75 65 2c 20 74 68 65 72 65 20 61  is true, there a
8630: 72 65 20 6e 6f 20 6f 74 68 65 72 20 61 63 74 69  re no other acti
8640: 76 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 20  ve queries.     
8650: 20 2a 2a 20 75 73 69 6e 67 20 74 68 69 73 20 68   ** using this h
8660: 61 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 64  andle and the vd
8670: 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
8680: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74  uccessful or hit
8690: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 27 4f 52   an.      ** 'OR
86a0: 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
86b0: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  t. This means a 
86c0: 63 6f 6d 6d 69 74 20 69 73 20 72 65 71 75 69 72  commit is requir
86d0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
86e0: 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65     int rc = vdbe
86f0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
8700: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8710: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
8720: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
8730: 55 53 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  USY;.      }else
8740: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8750: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OK ){.        p-
8760: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
8770: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
8780: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a  3BtreeRollback;.
8790: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
87a0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
87b0: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
87c0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s(db);.      }. 
87d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
87e0: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
87f0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  treeRollback;.  
8800: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20    }.  }else{..  
8810: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8820: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
8830: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
8840: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
8850: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
8860: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
8870: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
8880: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
8890: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
88a0: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
88b0: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
88c0: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
88d0: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
88e0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
88f0: 61 6c 20 20 20 20 20 20 20 20 20 20 2d 3e 20 72  al          -> r
8900: 6f 6c 6c 62 61 63 6b 20 73 74 61 74 65 6d 65 6e  ollback statemen
8910: 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  t.      **     Q
8920: 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61  uery without sta
8930: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 20  tement journal  
8940: 20 20 20 20 20 2d 3e 20 72 6f 6c 6c 62 61 63 6b       -> rollback
8950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
8960: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
8970: 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74  e could do somet
8980: 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e  hing more elegan
8990: 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61 74  t than this stat
89a0: 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65  ic analysis (i.e
89b0: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65  ..      ** store
89c0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75 65   the type of que
89d0: 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ry as part of th
89e0: 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68  e compliation ph
89f0: 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20  ase), but .     
8a00: 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c   ** handling mal
8a10: 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 69 73  loc() failure is
8a20: 20 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72   a fairly obscur
8a30: 65 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 74  e edge case so t
8a40: 68 69 73 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  his is.      ** 
8a50: 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e  probably easier.
8a60: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
8a70: 2a 2a 20 54 6f 64 6f 3a 20 54 68 69 73 20 6d 65  ** Todo: This me
8a80: 61 6e 73 20 77 65 20 61 6c 77 61 79 73 20 6f 76  ans we always ov
8a90: 65 72 72 69 64 65 20 74 68 65 20 70 2d 3e 65 72  erride the p->er
8aa0: 72 6f 72 41 63 74 69 6f 6e 20 76 61 6c 75 65 20  rorAction value 
8ab0: 66 6f 72 20 61 0a 20 20 20 20 20 20 2a 2a 20 6d  for a.      ** m
8ac0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
8ad0: 20 49 73 20 74 68 65 72 65 20 61 6e 79 20 6f 74   Is there any ot
8ae0: 68 65 72 20 63 68 6f 69 63 65 20 68 65 72 65 20  her choice here 
8af0: 74 68 6f 75 67 68 3f 0a 20 20 20 20 20 20 2a 2f  though?.      */
8b00: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 52 65 61  .      int isRea
8b10: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  dOnly = 1;.     
8b20: 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74   int isStatement
8b30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
8b40: 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e  rt(p->aOp || p->
8b50: 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66  nOp==0);.      f
8b60: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
8b70: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
8b80: 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b   switch( p->aOp[
8b90: 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  i].opcode ){.   
8ba0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54         case OP_T
8bb0: 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20  ransaction:.    
8bc0: 20 20 20 20 20 20 20 20 69 73 52 65 61 64 4f 6e          isReadOn
8bd0: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
8be0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8bf0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
8c00: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
8c10: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
8c20: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
8c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8c40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8c50: 69 66 28 20 28 69 73 52 65 61 64 4f 6e 6c 79 7c  if( (isReadOnly|
8c60: 7c 69 73 53 74 61 74 65 6d 65 6e 74 29 20 26 26  |isStatement) &&
8c70: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 21   p->errorAction!
8c80: 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  =OE_Rollback ){.
8c90: 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f 72          p->error
8ca0: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
8cb0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  t;.      }else{ 
8cc0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f  .        p->erro
8cd0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 52 6f 6c  rAction = OE_Rol
8ce0: 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  lback;.      }. 
8cf0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
8d00: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
8d10: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
8d20: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
8d30: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
8d40: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
8d50: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
8d60: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
8d70: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
8d80: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
8d90: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
8da0: 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tmt;.    }else{.
8db0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
8dc0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
8dd0: 63 6b 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75  ck;.      db->au
8de0: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
8df0: 20 20 20 20 61 62 6f 72 74 4f 74 68 65 72 41 63      abortOtherAc
8e00: 74 69 76 65 56 64 62 65 73 28 70 29 3b 0a 20 20  tiveVdbes(p);.  
8e10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
8e20: 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55   xFunc is not NU
8e30: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f  LL, then it is o
8e40: 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ne of sqlite3Btr
8e50: 65 65 52 6f 6c 6c 62 61 63 6b 2c 0a 20 20 2a 2a  eeRollback,.  **
8e60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
8e70: 6c 62 61 63 6b 53 74 6d 74 20 6f 72 20 73 71 6c  lbackStmt or sql
8e80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
8e90: 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63  tmt. Call it onc
8ea0: 65 20 6f 6e 0a 20 20 2a 2a 20 65 61 63 68 20 62  e on.  ** each b
8eb0: 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72  ackend. If an er
8ec0: 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
8ed0: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  he return code i
8ee0: 73 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 53 51 4c  s still.  ** SQL
8ef0: 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20  ITE_OK, set the 
8f00: 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74  return code to t
8f10: 68 65 20 6e 65 77 20 65 72 72 6f 72 20 76 61 6c  he new error val
8f20: 75 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ue..  */.  for(i
8f30: 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64  =0; xFunc && i<d
8f40: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8f50: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
8f60: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
8f70: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
8f80: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
8f90: 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29   rc = xFunc(pBt)
8fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
8fb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
8fc0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d  ->rc = rc;.    }
8fd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8fe0: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
8ff0: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
9000: 54 45 2c 20 73 65 74 20 74 68 65 20 63 68 61 6e  TE, set the chan
9010: 67 65 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20  ge counter. */. 
9020: 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
9030: 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  tOn && p->pc>=0 
9040: 29 7b 0a 20 20 20 20 69 66 28 20 21 78 46 75 6e  ){.    if( !xFun
9050: 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69  c || xFunc==sqli
9060: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
9070: 6d 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mt ){.      sqli
9080: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
9090: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
90a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
90b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
90c0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
90d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
90e0: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  Change = 0;.  }.
90f0: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f  .  /* Rollback o
9100: 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68  r commit any sch
9110: 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74  ema changes that
9120: 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20   occurred. */.  
9130: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
9140: 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67  E_OK && db->flag
9150: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
9160: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
9170: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
9180: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
9190: 0a 20 20 20 20 69 66 28 20 78 46 75 6e 63 21 3d  .    if( xFunc!=
91a0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
91b0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 64 62  back ){.      db
91c0: 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66  ->flags = (db->f
91d0: 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e  lags | SQLITE_In
91e0: 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20  ternChanges);.  
91f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65    }.  }..  /* We
9200: 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
9210: 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
9220: 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
9230: 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
9240: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
9250: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74  0 ){.    db->act
9260: 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iveVdbeCnt--;.  
9270: 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
9280: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
9290: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
92a0: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74  eCnt(db);..  ret
92b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
92c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
92d0: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
92e0: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
92f0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
9300: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
9310: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
9320: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
9330: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
9340: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
9350: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
9360: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
9370: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
9380: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
9390: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
93a0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
93b0: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
93c0: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
93d0: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
93e0: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
93f0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
9400: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
9410: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
9420: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
9430: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
9440: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
9450: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
9460: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  ){.  if( p->magi
9470: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
9480: 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56  N && p->magic!=V
9490: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
94a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
94b0: 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  or(p->db, SQLITE
94c0: 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20  _MISUSE, 0);.   
94d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
94e0: 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ISUSE;.  }..  /*
94f0: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
9500: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
9510: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
9520: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
9530: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
9540: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
9550: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
9560: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
9570: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
9580: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
9590: 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
95a0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
95b0: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
95c0: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
95d0: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
95e0: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
95f0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
9600: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
9610: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
9620: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
9630: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
9640: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
9650: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
9660: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
9670: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
9680: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
9690: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
96a0: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
96b0: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
96c0: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
96d0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
96e0: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
96f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9700: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
9710: 63 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 45 72 72  c, "%s", p->zErr
9720: 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
9730: 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  teFree(p->zErrMs
9740: 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  g);.      p->zEr
9750: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
9760: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
9770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9780: 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63  ror(p->db, p->rc
9790: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
97a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
97b0: 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  ror(p->db, SQLIT
97c0: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E_OK, 0);.    }.
97d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
97e0: 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
97f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
9800: 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
9810: 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
9820: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
9830: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
9840: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
9850: 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
9860: 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
9870: 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
9880: 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
9890: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
98a0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
98b0: 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
98c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d   sqlite3Error(p-
98d0: 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  >db, p->rc, 0);.
98e0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
98f0: 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
9900: 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
9910: 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
9920: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
9930: 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
9940: 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
9950: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   run..  */.  ass
9960: 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d  ert( p->pTos<&p-
9970: 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f  >aStack[p->pc<0?
9980: 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e  0:p->pc] || !p->
9990: 61 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66  aStack );.#ifdef
99a0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
99b0: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
99c0: 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
99d0: 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
99e0: 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
99f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9a00: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
9a10: 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
9a20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9a30: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
9a40: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
9a50: 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
9a60: 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
9a70: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
9a80: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
9a90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
9aa0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
9ab0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
9ac0: 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c  "%6d %10lld %8ll
9ad0: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
9ae0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
9af0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
9b00: 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
9b10: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
9b20: 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
9b30: 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
9b40: 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
9b50: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73      );.        s
9b60: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
9b70: 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
9b80: 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
9b90: 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
9ba0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9bb0: 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
9bc0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
9bd0: 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20  .  p->aborted = 
9be0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
9bf0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29 7b  SQLITE_SCHEMA ){
9c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
9c10: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
9c20: 70 2d 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20  p->db, 0);.  }. 
9c30: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
9c40: 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
9c50: 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
9c60: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
9c70: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
9c80: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
9c90: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
9ca0: 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
9cb0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
9cc0: 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
9cd0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
9ce0: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
9cf0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
9d00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
9d10: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
9d20: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
9d30: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
9d40: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
9d50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
9d60: 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 7d 65  beReset(p);.  }e
9d70: 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  lse if( p->magic
9d80: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  !=VDBE_MAGIC_INI
9d90: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
9da0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
9db0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
9dc0: 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
9dd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9de0: 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75   Call the destru
9df0: 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75  ctor for each au
9e00: 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70  xdata entry in p
9e10: 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69  VdbeFunc for whi
9e20: 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  ch.** the corres
9e30: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d  ponding bit in m
9e40: 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41  ask is clear.  A
9e50: 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62  uxdata entries b
9e60: 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20  eyond 31.** are 
9e70: 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64  always destroyed
9e80: 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c  .  To destroy al
9e90: 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65  l auxdata entrie
9ea0: 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  s, call this.** 
9eb0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73  routine with mas
9ec0: 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  k==0..*/.void sq
9ed0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
9ee0: 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20  uxData(VdbeFunc 
9ef0: 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20  *pVdbeFunc, int 
9f00: 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  mask){.  int i;.
9f10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64    for(i=0; i<pVd
9f20: 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b  beFunc->nAux; i+
9f30: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41  +){.    struct A
9f40: 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26  uxData *pAux = &
9f50: 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78  pVdbeFunc->apAux
9f60: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e  [i];.    if( (i>
9f70: 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c  31 || !(mask&(1<
9f80: 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
9f90: 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
9fa0: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
9fb0: 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
9fc0: 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
9fd0: 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
9fe0: 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
9ff0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
a000: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
a010: 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
a020: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a030: 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
a040: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
a050: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
a060: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69   Cleanup(p);.  i
a070: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
a080: 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
a090: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
a0a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
a0b0: 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65  rt( p->db->pVdbe
a0c0: 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62  ==p );.    p->db
a0d0: 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
a0e0: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
a0f0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
a100: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a110: 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
a120: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
a130: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a140: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
a150: 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61   Op *pOp = &p->a
a160: 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72 65  Op[i];.      fre
a170: 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c  eP3(pOp->p3type,
a180: 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7d   pOp->p3);.    }
a190: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a1a0: 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72  p->aOp);.  }.  r
a1b0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
a1c0: 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
a1d0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
a1e0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
a1f0: 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63  iteFree(p->aStac
a200: 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  k);.  releaseMem
a210: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
a220: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
a230: 2a 32 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  *2);.  sqliteFre
a240: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
a250: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
a260: 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
a270: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
a280: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ../*.** If a Mov
a290: 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
a2a0: 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
a2b0: 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
a2c0: 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
a2d0: 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72  veTo now.  Retur
a2e0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
a2f0: 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69    If no MoveTo i
a300: 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a  s pending, this.
a310: 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  ** routine does 
a320: 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75  nothing and retu
a330: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
a340: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
a350: 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75  eCursorMoveto(Cu
a360: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
a370: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
a380: 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
a390: 2c 20 72 63 3b 0a 20 20 20 20 65 78 74 65 72 6e  , rc;.    extern
a3a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
a3b0: 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61  rch_count;.    a
a3c0: 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
a3d0: 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e );.    if( p->
a3e0: 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  isTable ){.     
a3f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
a400: 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72  eeMoveto(p->pCur
a410: 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
a420: 6f 54 61 72 67 65 74 2c 20 26 72 65 73 29 3b 0a  oTarget, &res);.
a430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
a450: 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72  eeMoveto(p->pCur
a460: 73 6f 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e 6d  sor,(char*)&p->m
a470: 6f 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20 20  ovetoTarget,.   
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 20 20 73 69 7a 65 6f             sizeo
a4a0: 66 28 69 36 34 29 2c 26 72 65 73 29 3b 0a 20 20  f(i64),&res);.  
a4b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
a4c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a4d0: 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30  *p->pIncrKey = 0
a4e0: 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77  ;.    p->lastRow
a4f0: 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d  id = keyToInt(p-
a500: 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a  >movetoTarget);.
a510: 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61      p->rowidIsVa
a520: 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20  lid = res==0;.  
a530: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
a540: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a550: 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43  3BtreeNext(p->pC
a560: 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
a570: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
a580: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
a590: 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
a5a0: 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d  _count++;.    p-
a5b0: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
a5c0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
a5d0: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  eValid = 0;.  }.
a5e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a5f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
a600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
a610: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
a620: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
a630: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
a640: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
a650: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
a660: 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20  SerialRead().** 
a670: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
a680: 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
a690: 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65  3VdbeSerialWrite
a6a0: 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
a6b0: 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
a6c0: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
a6d0: 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
a6e0: 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
a6f0: 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
a700: 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
a710: 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
a720: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
a730: 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
a740: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
a750: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
a760: 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
a770: 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
a780: 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
a790: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
a7a0: 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
a7b0: 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
a7c0: 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
a7d0: 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
a7e0: 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
a7f0: 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
a800: 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
a810: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
a820: 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
a830: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
a840: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
a850: 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
a860: 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
a870: 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
a880: 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
a890: 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
a8a0: 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
a8b0: 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
a8c0: 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
a8d0: 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
a8e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a8f0: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
a900: 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
a910: 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
a920: 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
a930: 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
a940: 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
a950: 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
a960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
a970: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
a980: 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
a990: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
a9c0: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
a9f0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
aa00: 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
aa20: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
aa30: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
aa40: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
aa50: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
aa60: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
aa70: 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
aaa0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
aab0: 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
aac0: 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
aad0: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
aae0: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
ab10: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
ab20: 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
ab50: 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 38 2d   float.**     8-
ab60: 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
ab90: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
aba0: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
abb0: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
abc0: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
abd0: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
abe0: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
abf0: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a      text.**.*/..
ac00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ac10: 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
ac20: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
ac30: 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
ac40: 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
ac50: 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
ac60: 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  m){.  int flags 
ac70: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a  = pMem->flags;..
ac80: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
ac90: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
aca0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
acb0: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
acc0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
acd0: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
ace0: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
acf0: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
ad00: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
ad10: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31   ((((i64)0x00001
ad20: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
ad30: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69   i64 i = pMem->i
ad40: 3b 0a 20 20 20 20 75 36 34 20 75 20 3d 20 69 3c  ;.    u64 u = i<
ad50: 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20  0 ? -i : i;.    
ad60: 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
ad70: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
ad80: 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
ad90: 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
ada0: 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
adb0: 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
adc0: 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
add0: 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
ade0: 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
adf0: 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
ae00: 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
ae10: 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
ae20: 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
ae30: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
ae40: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e 74  M_Str ){.    int
ae50: 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20   n = pMem->n;.  
ae60: 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
ae70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 6e  ;.    return ((n
ae80: 2a 32 29 20 2b 20 31 33 29 3b 0a 20 20 7d 0a 20  *2) + 13);.  }. 
ae90: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 42   if( flags&MEM_B
aea0: 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lob ){.    retur
aeb0: 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31  n (pMem->n*2 + 1
aec0: 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  2);.  }.  return
aed0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
aee0: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
aef0: 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
af00: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
af10: 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
af20: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
af30: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
af40: 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
af50: 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
af60: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
af70: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
af80: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
af90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
afa0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
afb0: 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
afc0: 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
afd0: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
afe0: 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
aff0: 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
b000: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  }.}../*.** Write
b010: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
b020: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
b030: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
b040: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
b050: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
b060: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
b070: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
b080: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
b090: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
b0a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b0b0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69 6e   written..*/ .in
b0c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
b0d0: 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65 64 20  ialPut(unsigned 
b0e0: 63 68 61 72 20 2a 62 75 66 2c 20 4d 65 6d 20 2a  char *buf, Mem *
b0f0: 70 4d 65 6d 29 7b 0a 20 20 75 33 32 20 73 65 72  pMem){.  u32 ser
b100: 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
b110: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
b120: 28 70 4d 65 6d 29 3b 0a 20 20 69 6e 74 20 6c 65  (pMem);.  int le
b130: 6e 3b 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  n;..  /* NULL */
b140: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
b150: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pe==0 ){.    ret
b160: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 2f  urn 0;.  }. .  /
b170: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
b180: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
b190: 61 6c 5f 74 79 70 65 3c 3d 37 20 29 7b 0a 20 20  al_type<=7 ){.  
b1a0: 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74    u64 v;.    int
b1b0: 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
b1c0: 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
b1d0: 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26      v = *(u64*)&
b1e0: 70 4d 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c  pMem->r;.    }el
b1f0: 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28  se{.      v = *(
b200: 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20  u64*)&pMem->i;. 
b210: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
b220: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
b230: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
b240: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68  al_type);.    wh
b250: 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
b260: 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78    buf[i] = (v&0x
b270: 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
b280: 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
b290: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  turn len;.  }.  
b2a0: 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
b2b0: 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73 65 72 74  blob */.  assert
b2c0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
b2d0: 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  2 );.  len = sql
b2e0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
b2f0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
b300: 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 62 75 66  e);.  memcpy(buf
b310: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
b320: 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d  .  return len;.}
b330: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
b340: 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
b350: 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
b360: 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
b370: 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
b380: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
b390: 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
b3a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
b3b0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
b3c0: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
b3d0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
b3e0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
b3f0: 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
b400: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
b410: 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
b420: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
b430: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
b440: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
b450: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
b460: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
b490: 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
b4a0: 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
b4b0: 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
b4c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 38 3a 20   ){.    case 8: 
b4d0: 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
b4e0: 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
b4f0: 0a 20 20 20 20 63 61 73 65 20 39 3a 20 20 20 20  .    case 9:    
b500: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
b510: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
b520: 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
b530: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
b540: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
b550: 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
b560: 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
b570: 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
b580: 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
b590: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
b5a0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b5b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
b5d0: 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
b5e0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
b5f0: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 73 69     pMem->i = (si
b600: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
b610: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
b620: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
b630: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b640: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
b650: 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
b660: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
b670: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28       pMem->i = (
b680: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
b690: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
b6a0: 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
b6b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
b6c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
b6d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b6e0: 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
b6f0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
b700: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  .      pMem->i =
b710: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
b720: 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
b730: 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
b740: 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
b750: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b760: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
b770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b780: 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
b790: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
b7a0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20  /.      pMem->i 
b7b0: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
b7c0: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
b7d0: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
b7e0: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
b7f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
b800: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
b810: 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
b820: 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
b830: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
b840: 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
b850: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
b860: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
b870: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
b880: 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
b890: 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
b8a0: 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
b8b0: 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
b8c0: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
b8d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a       pMem->i = *
b8e0: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
b8f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b900: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
b910: 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
b920: 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
b930: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
b940: 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
b950: 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
b960: 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
b970: 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
b980: 20 20 75 33 32 20 79 3b 0a 23 69 66 6e 64 65 66    u32 y;.#ifndef
b990: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a   NDEBUG.      /*
b9a0: 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
b9b0: 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
b9c0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
b9d0: 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
b9e0: 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
b9f0: 2e 20 20 54 68 65 20 62 79 74 65 20 6f 72 64 65  .  The byte orde
ba00: 72 20 64 69 66 66 65 72 73 20 6f 6e 20 73 6f 6d  r differs on som
ba10: 65 20 28 62 72 6f 6b 65 6e 29 20 61 72 63 68 69  e (broken) archi
ba20: 74 65 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20  tectures..      
ba30: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
ba40: 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
ba50: 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
ba60: 3c 3c 33 32 3b 0a 20 20 20 20 20 20 61 73 73 65  <<32;.      asse
ba70: 72 74 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62 6c  rt( 1.0==*(doubl
ba80: 65 2a 29 26 74 31 20 29 3b 0a 23 65 6e 64 69 66  e*)&t1 );.#endif
ba90: 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
baa0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
bab0: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
bac0: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
bad0: 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
bae0: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
baf0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
bb00: 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
bb10: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
bb20: 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
bb30: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
bb40: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  .        pMem->i
bb50: 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
bb60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
bb70: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
bb80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bb90: 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f    pMem->r = *(do
bba0: 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20 20  uble*)&x;.      
bbb0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
bbc0: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
bbd0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
bbe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
bbf0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
bc00: 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
bc10: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
bc20: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
bc30: 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
bc40: 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
bc50: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
bc60: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
bc70: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
bc80: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
bc90: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
bca0: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
bcb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bcc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
bcd0: 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
bce0: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
bcf0: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
bd00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bd10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
bd20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
bd30: 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
bd40: 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
bd50: 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66 69   records specifi
bd60: 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31  ed by .** {nKey1
bd70: 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b  , pKey1} and {nK
bd80: 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74  ey2, pKey2}, ret
bd90: 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76  urning a negativ
bda0: 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
bdb0: 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
bdc0: 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  f {nKey1, pKey1}
bdd0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
bde0: 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
bdf0: 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65  reater than {nKe
be00: 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74  y2, pKey2}.  Bot
be10: 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  h Key1 and Key2 
be20: 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74 72  must be byte str
be30: 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64  ings.** composed
be40: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
be50: 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
be60: 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74  the VDBE..*/.int
be70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
be80: 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69  rdCompare(.  voi
be90: 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69  d *userData,.  i
bea0: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
beb0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20  void *pKey1, .  
bec0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
bed0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
bee0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
bef0: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
bf00: 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20  userData;.  u32 
bf10: 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20  d1, d2;         
bf20: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
bf30: 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
bf40: 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
bf50: 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b   u32 idx1, idx2;
bf60: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
bf70: 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
bf80: 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
bf90: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
bfa0: 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20  r1, szHdr2;  /* 
bfb0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
bfc0: 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
bfd0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
bfe0: 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63  nField;.  int rc
bff0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
c000: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
c010: 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
c020: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
c030: 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  1;.  const unsig
c040: 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20  ned char *aKey2 
c050: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
c060: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a  d char *)pKey2;.
c070: 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d  .  Mem mem1;.  M
c080: 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e  em mem2;.  mem1.
c090: 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
c0a0: 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20  enc;.  mem2.enc 
c0b0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
c0c0: 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 73 71 6c  .  .  idx1 = sql
c0d0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
c0e0: 70 4b 65 79 31 2c 20 26 73 7a 48 64 72 31 29 3b  pKey1, &szHdr1);
c0f0: 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
c100: 20 20 69 64 78 32 20 3d 20 73 71 6c 69 74 65 33    idx2 = sqlite3
c110: 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b 65 79  GetVarint32(pKey
c120: 32 2c 20 26 73 7a 48 64 72 32 29 3b 0a 20 20 64  2, &szHdr2);.  d
c130: 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46  2 = szHdr2;.  nF
c140: 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
c150: 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65  >nField;.  while
c160: 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
c170: 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a   idx2<szHdr2 ){.
c180: 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
c190: 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65  ype1;.    u32 se
c1a0: 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20  rial_type2;..   
c1b0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
c1c0: 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
c1d0: 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
c1e0: 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
c1f0: 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74     idx1 += sqlit
c200: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  e3GetVarint32(&a
c210: 4b 65 79 31 5b 69 64 78 31 5d 2c 20 26 73 65 72  Key1[idx1], &ser
c220: 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20  ial_type1);.    
c230: 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
c240: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c250: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
c260: 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
c270: 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 73  k;.    idx2 += s
c280: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
c290: 32 28 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c 20  2(&aKey2[idx2], 
c2a0: 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a  &serial_type2);.
c2b0: 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79      if( d2>=nKey
c2c0: 32 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  2 && sqlite3Vdbe
c2d0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
c2e0: 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29 20  rial_type2)>0 ) 
c2f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 41  break;..    /* A
c300: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 72 65  ssert that there
c310: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
c320: 20 6c 65 66 74 20 69 6e 20 65 61 63 68 20 6b 65   left in each ke
c330: 79 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 6f  y for the blob o
c340: 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 74 6f  f.    ** data to
c350: 20 67 6f 20 77 69 74 68 20 74 68 65 20 73 65 72   go with the ser
c360: 69 61 6c 20 74 79 70 65 20 6a 75 73 74 20 72 65  ial type just re
c370: 61 64 2e 20 54 68 69 73 20 61 73 73 65 72 74 20  ad. This assert 
c380: 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 20 20 20  may fail if.    
c390: 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  ** the file is c
c3a0: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 6e 20  orrupted.  Then 
c3b0: 72 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  read the value f
c3c0: 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 69 6e 74  rom each key int
c3d0: 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61 6e  o mem1.    ** an
c3e0: 64 20 6d 65 6d 32 20 72 65 73 70 65 63 74 69 76  d mem2 respectiv
c3f0: 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ely..    */.    
c400: 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
c410: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
c420: 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
c430: 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  pe1, &mem1);.   
c440: 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d2 += sqlite3Vd
c450: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
c460: 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74  y2[d2], serial_t
c470: 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20  ype2, &mem2);.. 
c480: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
c490: 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
c4a0: 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64   &mem2, i<nField
c4b0: 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
c4c0: 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
c4d0: 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  if( mem1.flags &
c4e0: 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74   MEM_Dyn ) sqlit
c4f0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
c500: 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28  (&mem1);.    if(
c510: 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45   mem2.flags & ME
c520: 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56  M_Dyn ) sqlite3V
c530: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
c540: 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63  em2);.    if( rc
c550: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  !=0 ){.      bre
c560: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  ak;.    }.    i+
c570: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65  +;.  }..  /* One
c580: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
c590: 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20   out of fields, 
c5a0: 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c  but all the fiel
c5b0: 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
c5c0: 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71  int.  ** were eq
c5d0: 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72  ual. If the incr
c5e0: 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  Key flag is true
c5f0: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
c600: 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72  d key is.  ** tr
c610: 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e  eated as larger.
c620: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
c630: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65  0 ){.    if( pKe
c640: 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29  yInfo->incrKey )
c650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
c660: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
c670: 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  1<nKey1 ){.     
c680: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
c690: 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20  se if( d2<nKey2 
c6a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
c6b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
c6c0: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
c6d0: 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65  rtOrder && i<pKe
c6e0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 26 26  yInfo->nField &&
c6f0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
c700: 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
c710: 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20  rc = -rc;.  }.. 
c720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c730: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
c740: 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e  t is an index en
c750: 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69  try composed usi
c760: 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
c770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
c780: 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  The last entry i
c790: 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20 73 68  n this record sh
c7a0: 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
c7b0: 65 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79  er (specifically
c7c0: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72  .** an integer r
c7d0: 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75  owid).  This rou
c7e0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
c7f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c800: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65   in.** that inte
c810: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
c820: 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
c830: 65 6e 28 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  en(int nKey, con
c840: 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
c850: 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
c860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
c870: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
c880: 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
c890: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
c8a0: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20   the rowid */.. 
c8b0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
c8c0: 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72  t32(aKey, &szHdr
c8d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
c8e0: 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a  arint32(&aKey[sz
c8f0: 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77  Hdr-1], &typeRow
c900: 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  id);.  return sq
c910: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
c920: 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
c930: 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  );.}.  ../*.** p
c940: 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
c950: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
c960: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
c970: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
c980: 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
c990: 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
c9a0: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
c9b0: 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
c9c0: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
c9d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c9e0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
c9f0: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
ca00: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
ca10: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
ca20: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
ca30: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
ca40: 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
ca50: 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74   nCellKey;.  int
ca60: 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
ca70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
ca80: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
ca90: 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
caa0: 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
cab0: 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
cac0: 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
cad0: 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
cae0: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
caf0: 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
cb00: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
cb10: 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
cb20: 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c  Key);.  if( nCel
cb30: 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72  lKey<=0 ){.    r
cb40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
cb50: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
cb60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
cb70: 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
cb80: 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
cb90: 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
cba0: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
cbb0: 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rc;.  }.  sqlite
cbc0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  3GetVarint32((u8
cbd0: 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a  *)m.z, &szHdr);.
cbe0: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
cbf0: 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
cc00: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
cc10: 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64  wid);.  lenRowid
cc20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
cc30: 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
cc40: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
cc50: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
cc60: 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
cc70: 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
cc80: 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
cc90: 20 3d 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74 65   = v.i;.  sqlite
cca0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
ccb0: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
ccc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ccd0: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
cce0: 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
ccf0: 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
cd00: 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20   pC is point to 
cd10: 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
cd20: 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65  ey string in pKe
cd30: 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65  y (of length nKe
cd40: 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  y).  Write into 
cd50: 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
cd60: 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
cd70: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
cd80: 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
cd90: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
cda0: 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
cdb0: 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65  r than pKey.  Re
cdc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
cdd0: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
cde0: 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20   pKey is either 
cdf0: 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
ce00: 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
ce10: 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
ce20: 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
ce30: 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
ce40: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
ce50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
ce60: 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
ce70: 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
ce80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ce90: 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
cea0: 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c  e(.  Cursor *pC,
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
ced0: 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
cee0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
cef0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c   const u8 *pKey,
cf00: 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f     /* The key to
cf10: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e   compare */.  in
cf20: 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
cf30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
cf40: 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
cf50: 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
cf60: 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
cf70: 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ey;.  int rc;.  
cf80: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
cf90: 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
cfa0: 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20  int lenRowid;.  
cfb0: 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  Mem m;..  sqlite
cfc0: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
cfd0: 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
cfe0: 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
cff0: 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  0 ){.    *res = 
d000: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
d010: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
d020: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
d030: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
d040: 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c  pCursor, 0, nCel
d050: 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
d060: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
d070: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c  turn rc;.  }.  l
d080: 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
d090: 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
d0a0: 28 6d 2e 6e 2c 20 28 75 38 2a 29 6d 2e 7a 29 3b  (m.n, (u8*)m.z);
d0b0: 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
d0c0: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
d0d0: 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  re(pC->pKeyInfo,
d0e0: 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d   m.n-lenRowid, m
d0f0: 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  .z, nKey, pKey);
d100: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
d110: 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
d120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d140: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
d150: 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
d160: 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
d170: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
d180: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
d190: 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
d1a0: 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
d1b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d1c0: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
d1d0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
d1e0: 43 68 61 6e 67 65 29 7b 0a 20 20 64 62 2d 3e 6e  Change){.  db->n
d1f0: 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
d200: 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
d210: 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
d220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
d230: 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
d240: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
d250: 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
d260: 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
d270: 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
d280: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d290: 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
d2a0: 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
d2b0: 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
d2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
d2d0: 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
d2e0: 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
d2f0: 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
d300: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
d310: 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
d320: 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
d330: 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
d340: 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
d350: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
d360: 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
d370: 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
d380: 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
d390: 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
d3a0: 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
d3b0: 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
d3c0: 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
d3d0: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
d3e0: 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
d3f0: 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
d400: 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
d410: 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
d420: 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
d430: 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
d440: 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
d450: 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
d460: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
d470: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
d480: 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
d490: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
d4a0: 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
d4b0: 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
d4c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
d4d0: 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
d4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d4f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
d500: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
d510: 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
d520: 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
d530: 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
d540: 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.