/ Hex Artifact Content
Login

Artifact 68c24aa7b7facf7412755f3807d8a3acf4e29963:


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 5f 76 6d 22 20 61 73 20 69  "sqlite_vm" as i
01e0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  t is known to th
01f0: 65 20 6f 75 74 73 69 64 65 20 77 6f 72 6c 64 2e  e outside world.
0200: 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 6f 20 76  )  Prior.** to v
0210: 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c 20 61 6c  ersion 2.8.7, al
0220: 6c 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  l this code was 
0230: 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
0240: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
0250: 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 74 68 61  file..** But tha
0260: 74 20 66 69 6c 65 20 77 61 73 20 67 65 74 74 69  t file was getti
0270: 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f 20 74 68  ng too big so th
0280: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  is subroutines w
0290: 65 72 65 20 73 70 6c 69 74 20 6f 75 74 2e 0a 2a  ere split out..*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02d0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63  e <ctype.h>.#inc
02e0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65  .../*.** When de
0300: 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65  bugging the code
0310: 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20   generator in a 
0320: 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65  symbolic debugge
0330: 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65  r, one can.** se
0340: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 76 64 62  t the sqlite_vdb
0350: 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 74 6f  e_addop_trace to
0360: 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64   1 and all opcod
0370: 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74  es will be print
0380: 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72  ed.** as they ar
0390: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
03a0: 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61  nstruction strea
03b0: 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  m..*/.#ifndef ND
03c0: 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 5f  EBUG.int sqlite_
03d0: 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65  vdbe_addop_trace
03e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f   = 0;.#endif.../
03f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
0400: 77 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  w virtual databa
0410: 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64  se engine..*/.Vd
0420: 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 43  be *sqlite3VdbeC
0430: 72 65 61 74 65 28 73 71 6c 69 74 65 20 2a 64 62  reate(sqlite *db
0440: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
0450: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
0460: 28 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  ( sizeof(Vdbe) )
0470: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
0480: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0490: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
04a0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
04b0: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
04c0: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
04d0: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
04e0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
04f0: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0500: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0510: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0520: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
0530: 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67  .** Turn tracing
0540: 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f   on or off.*/.vo
0550: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  id sqlite3VdbeTr
0560: 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c  ace(Vdbe *p, FIL
0570: 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e  E *trace){.  p->
0580: 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d  trace = trace;.}
0590: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
05a0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
05b0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
05c0: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
05d0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
05e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
05f0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
0600: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
0610: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
0620: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
0630: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
0640: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
0650: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
0660: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
0670: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
0680: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
0690: 31 2c 20 70 32 20 20 20 20 20 20 20 20 20 20 46  1, p2          F
06a0: 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68 65 20  irst two of the 
06b0: 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 6f  three possible o
06c0: 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 55  perands..**.** U
06d0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
06e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
06f0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0700: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0710: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0720: 62 65 43 68 61 6e 67 65 50 33 28 29 20 66 75 6e  beChangeP3() fun
0730: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0740: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0750: 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P3.** operand..
0760: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0770: 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a 70 2c  beAddOp(Vdbe *p,
0780: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
0790: 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e 74 20   int p2){.  int 
07a0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  i;.  VdbeOp *pOp
07b0: 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b  ;..  i = p->nOp;
07c0: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 61  .  p->nOp++;.  a
07d0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
07e0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
07f0: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
0800: 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  nOpAlloc ){.    
0810: 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d  int oldSize = p-
0820: 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 4f  >nOpAlloc;.    O
0830: 70 20 2a 61 4e 65 77 3b 0a 20 20 20 20 70 2d 3e  p *aNew;.    p->
0840: 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4f  nOpAlloc = p->nO
0850: 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30 3b 0a  pAlloc*2 + 100;.
0860: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
0870: 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c  eRealloc(p->aOp,
0880: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a   p->nOpAlloc*siz
0890: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66  eof(Op));.    if
08a0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
08b0: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
08c0: 20 6f 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20 20   oldSize;.      
08d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
08e0: 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e 65      p->aOp = aNe
08f0: 77 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  w;.    memset(&p
0900: 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20  ->aOp[oldSize], 
0910: 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d  0, (p->nOpAlloc-
0920: 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28  oldSize)*sizeof(
0930: 4f 70 29 29 3b 0a 20 20 7d 0a 20 20 70 4f 70 20  Op));.  }.  pOp 
0940: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0950: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70  pOp->opcode = op
0960: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
0970: 3b 0a 20 20 69 66 28 20 70 32 3c 30 20 26 26 20  ;.  if( p2<0 && 
0980: 28 2d 31 2d 70 32 29 3c 70 2d 3e 6e 4c 61 62 65  (-1-p2)<p->nLabe
0990: 6c 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d  l && p->aLabel[-
09a0: 31 2d 70 32 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  1-p2]>=0 ){.    
09b0: 70 32 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d  p2 = p->aLabel[-
09c0: 31 2d 70 32 5d 3b 0a 20 20 7d 0a 20 20 70 4f 70  1-p2];.  }.  pOp
09d0: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
09e0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  ->p3 = 0;.  pOp-
09f0: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  >p3type = P3_NOT
0a00: 55 53 45 44 3b 0a 23 69 66 6e 64 65 66 20 4e 44  USED;.#ifndef ND
0a10: 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74  EBUG.  if( sqlit
0a20: 65 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  e_vdbe_addop_tra
0a30: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0a40: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0a50: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0a60: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
0a70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
0a80: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
0a90: 65 73 20 74 68 65 20 70 33 20 76 61 6c 75 65 2e  es the p3 value.
0aa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
0ab0: 64 62 65 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  dbeOp3(Vdbe *p, 
0ac0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
0ad0: 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63 68  int p2, const ch
0ae0: 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20 70 33 74  ar *zP3, int p3t
0af0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ype){.  int addr
0b00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
0b10: 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  dOp(p, op, p1, p
0b20: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
0b30: 65 43 68 61 6e 67 65 50 33 28 70 2c 20 61 64 64  eChangeP3(p, add
0b40: 72 2c 20 7a 50 33 2c 20 70 33 74 79 70 65 29 3b  r, zP3, p3type);
0b50: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
0b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6d 75 6c  }../*.** Add mul
0b70: 74 69 70 6c 65 20 6f 70 63 6f 64 65 73 2e 20 20  tiple opcodes.  
0b80: 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72 6d  The list is term
0b90: 69 6e 61 74 65 64 20 62 79 20 61 6e 20 6f 70 63  inated by an opc
0ba0: 6f 64 65 20 6f 66 20 30 2e 0a 2a 2f 0a 69 6e 74  ode of 0..*/.int
0bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 64 65   sqlite3VdbeCode
0bc0: 28 56 64 62 65 20 2a 70 2c 20 2e 2e 2e 29 7b 0a  (Vdbe *p, ...){.
0bd0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 76 61    int addr;.  va
0be0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
0bf0: 6f 70 63 6f 64 65 2c 20 70 31 2c 20 70 32 3b 0a  opcode, p1, p2;.
0c00: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70    va_start(ap, p
0c10: 29 3b 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  );.  addr = p->n
0c20: 4f 70 3b 0a 20 20 77 68 69 6c 65 28 20 28 6f 70  Op;.  while( (op
0c30: 63 6f 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  code = va_arg(ap
0c40: 2c 69 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  ,int))!=0 ){.   
0c50: 20 70 31 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   p1 = va_arg(ap,
0c60: 69 6e 74 29 3b 0a 20 20 20 20 70 32 20 3d 20 76  int);.    p2 = v
0c70: 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
0c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0c90: 64 4f 70 28 70 2c 20 6f 70 63 6f 64 65 2c 20 70  dOp(p, opcode, p
0ca0: 31 2c 20 70 32 29 3b 0a 20 20 7d 0a 20 20 76 61  1, p2);.  }.  va
0cb0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
0cc0: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 0a 0a 2f 2a  rn addr;.}..../*
0cd0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
0ce0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
0cf0: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
0d00: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
0d10: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
0d20: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
0d30: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
0d40: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
0d50: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
0d60: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
0d70: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
0d80: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
0d90: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
0da0: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
0db0: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
0dc0: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
0dd0: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
0de0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
0df0: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
0e00: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
0e10: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
0e20: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
0e30: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
0e40: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
0e50: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
0e60: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
0e70: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
0e80: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
0e90: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
0ea0: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
0eb0: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
0ec0: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
0ed0: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
0ee0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
0ef0: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
0f00: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
0f10: 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  esolved..*/.int 
0f20: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
0f30: 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  abel(Vdbe *p){. 
0f40: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d   int i;.  i = p-
0f50: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
0f60: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
0f70: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
0f80: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c  ;.  if( i>=p->nL
0f90: 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  abelAlloc ){.   
0fa0: 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20   int *aNew;.    
0fb0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
0fc0: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
0fd0: 32 20 2b 20 31 30 3b 0a 20 20 20 20 61 4e 65 77  2 + 10;.    aNew
0fe0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
0ff0: 28 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 70 2d 3e  ( p->aLabel, p->
1000: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
1010: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1020: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
1030: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1040: 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c  teFree(p->aLabel
1050: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
1060: 61 4c 61 62 65 6c 20 3d 20 61 4e 65 77 3b 0a 20  aLabel = aNew;. 
1070: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62   }.  if( p->aLab
1080: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  el==0 ){.    p->
1090: 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20  nLabel = 0;.    
10a0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
10b0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
10c0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 61 62 65  ;.  }.  p->aLabe
10d0: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74  l[i] = -1;.  ret
10e0: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
10f0: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
1100: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
1110: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1120: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
1130: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
1140: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
1150: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
1160: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1170: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
1180: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
1190: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
11a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
11b0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
11c0: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
11d0: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
11e0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
11f0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1200: 69 66 28 20 78 3c 30 20 26 26 20 28 2d 78 29 3c  if( x<0 && (-x)<
1210: 3d 70 2d 3e 6e 4c 61 62 65 6c 20 26 26 20 70 2d  =p->nLabel && p-
1220: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  >aOp ){.    if( 
1230: 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d 3d  p->aLabel[-1-x]=
1240: 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74 75 72 6e  =p->nOp ) return
1250: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1260: 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d 3c 30 20  >aLabel[-1-x]<0 
1270: 29 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  );.    p->aLabel
1280: 5b 2d 31 2d 78 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  [-1-x] = p->nOp;
1290: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
12a0: 70 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20  p->nOp; j++){.  
12b0: 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 6a      if( p->aOp[j
12c0: 5d 2e 70 32 3d 3d 78 20 29 20 70 2d 3e 61 4f 70  ].p2==x ) p->aOp
12d0: 5b 6a 5d 2e 70 32 20 3d 20 70 2d 3e 6e 4f 70 3b  [j].p2 = p->nOp;
12e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
1300: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1310: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
1320: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
1330: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1340: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
1350: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
1360: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1370: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1380: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
1390: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
13a0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
13b0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
13c0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
13d0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
13e0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
13f0: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
1400: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1410: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
1420: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
1430: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
1440: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
1450: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
1460: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1470: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
1480: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
1490: 3e 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  >= p->nOpAlloc )
14a0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 53 69 7a  {.    int oldSiz
14b0: 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b  e = p->nOpAlloc;
14c0: 0a 20 20 20 20 4f 70 20 2a 61 4e 65 77 3b 0a 20  .    Op *aNew;. 
14d0: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
14e0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b   p->nOpAlloc*2 +
14f0: 20 6e 4f 70 20 2b 20 31 30 3b 0a 20 20 20 20 61   nOp + 10;.    a
1500: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
1510: 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  loc(p->aOp, p->n
1520: 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 4f  OpAlloc*sizeof(O
1530: 70 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  p));.    if( aNe
1540: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
1550: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f 6c 64 53  >nOpAlloc = oldS
1560: 69 7a 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ize;.      retur
1570: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
1580: 2d 3e 61 4f 70 20 3d 20 61 4e 65 77 3b 0a 20 20  ->aOp = aNew;.  
1590: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
15a0: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 70  [oldSize], 0, (p
15b0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c 64 53 69  ->nOpAlloc-oldSi
15c0: 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  ze)*sizeof(Op));
15d0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
15e0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e  >nOp;.  if( nOp>
15f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
1600: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
1610: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
1620: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1630: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
1640: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
1650: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
1660: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
1670: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
1680: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
1690: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
16a0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
16b0: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
16c0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c    pOut->p2 = p2<
16d0: 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28  0 ? addr + ADDR(
16e0: 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20  p2) : p2;.      
16f0: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
1700: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
1710: 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70 33  p3type = pIn->p3
1720: 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20 50   ? P3_STATIC : P
1730: 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64  3_NOTUSED;.#ifnd
1740: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
1750: 69 66 28 20 73 71 6c 69 74 65 5f 76 64 62 65 5f  if( sqlite_vdbe_
1760: 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a 20  addop_trace ){. 
1770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1780: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61  bePrintOp(0, i+a
1790: 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ddr, &p->aOp[i+a
17a0: 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ddr]);.      }.#
17b0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
17c0: 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20  p->nOp += nOp;. 
17d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
17e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
17f0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
1800: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f  he P1 operand fo
1810: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
1820: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
1830: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1840: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
1850: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
1860: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
1870: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
1880: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1890: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
18a0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
18b0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
18c0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
18d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18e0: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
18f0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
1900: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
1910: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1920: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1930: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
1940: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
1950: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
1960: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
1970: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
1980: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1990: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
19a0: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
19b0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
19c0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
19d0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
19e0: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
19f0: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
1a00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1a10: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
1a20: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
1a30: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
1a40: 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20 61  t( val>=0 );.  a
1a50: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1a60: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1a70: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
1a80: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
1a90: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
1aa0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
1ab0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
1ac0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
1ad0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
1ae0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
1af0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
1b00: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
1b10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1b20: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
1b30: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
1b40: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
1b50: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
1b60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b70: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
1b80: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
1b90: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
1ba0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
1bb0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
1bc0: 65 6e 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  en the P3 operan
1bd0: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
1be0: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
1bf0: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
1c00: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
1c10: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1c20: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
1c30: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
1c40: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
1c50: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 33 20  py bytes of zP3 
1c60: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
1c70: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
1c80: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
1c90: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
1ca0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 33 2e 0a  1 bytes of zP3..
1cb0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 33 5f 53  **.** If n==P3_S
1cc0: 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20  TATIC  it means 
1cd0: 74 68 61 74 20 7a 50 33 20 69 73 20 61 20 70 6f  that zP3 is a po
1ce0: 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74  inter to a const
1cf0: 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74  ant static.** st
1d00: 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20  ring and we can 
1d10: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
1d20: 69 6e 74 65 72 2e 20 20 6e 3d 3d 50 33 5f 50 4f  inter.  n==P3_PO
1d30: 49 4e 54 45 52 20 6d 65 61 6e 73 20 7a 50 33 20  INTER means zP3 
1d40: 69 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  is.** a pointer 
1d50: 74 6f 20 73 6f 6d 65 20 6f 62 6a 65 63 74 20 6f  to some object o
1d60: 74 68 65 72 20 74 68 61 6e 20 61 20 73 74 72 69  ther than a stri
1d70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  ng..**.** If add
1d80: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
1d90: 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P3 on the most r
1da0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
1db0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
1dc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1dd0: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
1de0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
1df0: 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e  st char *zP3, in
1e00: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
1e10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1e20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1e30: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d  INIT );.  if( p=
1e40: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  =0 || p->aOp==0 
1e50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1e60: 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d  addr<0 || addr>=
1e70: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64  p->nOp ){.    ad
1e80: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
1e90: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20  .    if( addr<0 
1ea0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
1eb0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
1ec0: 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  dr];.  if( pOp->
1ed0: 70 33 20 26 26 20 70 4f 70 2d 3e 70 33 74 79 70  p3 && pOp->p3typ
1ee0: 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b  e==P3_DYNAMIC ){
1ef0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1f00: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70 4f  pOp->p3);.    pO
1f10: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 7d 0a 20  p->p3 = 0;.  }. 
1f20: 20 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20   if( zP3==0 ){. 
1f30: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a     pOp->p3 = 0;.
1f40: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
1f50: 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P3_NOTUSED;.  
1f60: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
1f70: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28  .    pOp->p3 = (
1f80: 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70  char*)zP3;.    p
1f90: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a  Op->p3type = n;.
1fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1fb0: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26  ite3SetNString(&
1fc0: 70 4f 70 2d 3e 70 33 2c 20 7a 50 33 2c 20 6e 2c  pOp->p3, zP3, n,
1fd0: 20 30 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33   0);.    pOp->p3
1fe0: 74 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49  type = P3_DYNAMI
1ff0: 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  C;.  }.}../*.** 
2000: 49 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  If the P3 operan
2010: 64 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  d to the specifi
2020: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  ed instruction a
2030: 70 70 65 61 72 73 0a 2a 2a 20 74 6f 20 62 65 20  ppears.** to be 
2040: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
2050: 74 6f 6b 65 6e 2c 20 74 68 65 6e 20 74 68 69 73  token, then this
2060: 20 70 72 6f 63 65 64 75 72 65 20 72 65 6d 6f 76   procedure remov
2070: 65 73 20 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65  es .** the quote
2080: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 6f  s..**.** The quo
2090: 74 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 63 61  ting operator ca
20a0: 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 67 72  n be either a gr
20b0: 61 76 65 20 61 73 63 65 6e 74 20 28 41 53 43 49  ave ascent (ASCI
20c0: 49 20 30 78 32 37 29 0a 2a 2a 20 6f 72 20 61 20  I 0x27).** or a 
20d0: 64 6f 75 62 6c 65 20 71 75 6f 74 65 20 63 68 61  double quote cha
20e0: 72 61 63 74 65 72 20 28 41 53 43 49 49 20 30 78  racter (ASCII 0x
20f0: 32 32 29 2e 20 20 54 77 6f 20 71 75 6f 74 65 73  22).  Two quotes
2100: 20 69 6e 20 61 20 72 6f 77 0a 2a 2a 20 72 65 73   in a row.** res
2110: 6f 6c 76 65 20 74 6f 20 62 65 20 61 20 73 69 6e  olve to be a sin
2120: 67 6c 65 20 61 63 74 75 61 6c 20 71 75 6f 74 65  gle actual quote
2130: 20 63 68 61 72 61 63 74 65 72 20 77 69 74 68 69   character withi
2140: 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  n the string..*/
2150: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2160: 65 44 65 71 75 6f 74 65 50 33 28 56 64 62 65 20  eDequoteP3(Vdbe 
2170: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
2180: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65   Op *pOp;.  asse
2190: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
21a0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
21b0: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
21c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
21d0: 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e   addr<0 || addr>
21e0: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61  =p->nOp ){.    a
21f0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
2200: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30  ;.    if( addr<0
2210: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
2220: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
2230: 64 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  ddr];.  if( pOp-
2240: 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  >p3==0 || pOp->p
2250: 33 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  3[0]==0 ) return
2260: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 74  ;.  if( pOp->p3t
2270: 79 70 65 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20  ype==P3_POINTER 
2280: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2290: 70 4f 70 2d 3e 70 33 74 79 70 65 21 3d 50 33 5f  pOp->p3type!=P3_
22a0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70  DYNAMIC ){.    p
22b0: 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 53  Op->p3 = sqliteS
22c0: 74 72 44 75 70 28 70 4f 70 2d 3e 70 33 29 3b 0a  trDup(pOp->p3);.
22d0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
22e0: 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P3_DYNAMIC;.  
22f0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  }.  sqlite3Dequo
2300: 74 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 7d 0a 0a  te(pOp->p3);.}..
2310: 2f 2a 0a 2a 2a 20 4f 6e 20 74 68 65 20 50 33 20  /*.** On the P3 
2320: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 68 65 20  argument of the 
2330: 67 69 76 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  given instructio
2340: 6e 2c 20 63 68 61 6e 67 65 20 61 6c 6c 0a 2a 2a  n, change all.**
2350: 20 73 74 72 69 6e 67 73 20 6f 66 20 77 68 69 74   strings of whit
2360: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72  espace character
2370: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
2380: 73 70 61 63 65 20 61 6e 64 0a 2a 2a 20 64 65 6c  space and.** del
2390: 65 74 65 20 6c 65 61 64 69 6e 67 20 61 6e 64 20  ete leading and 
23a0: 74 72 61 69 6c 69 6e 67 20 77 68 69 74 65 73 70  trailing whitesp
23b0: 61 63 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ace..*/.void sql
23c0: 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73  ite3VdbeCompress
23d0: 53 70 61 63 65 28 56 64 62 65 20 2a 70 2c 20 69  Space(Vdbe *p, i
23e0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 75 6e 73 69  nt addr){.  unsi
23f0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
2400: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 4f 70 20 2a  int i, j;.  Op *
2410: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pOp;.  assert( p
2420: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2430: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2440: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 61  ( p->aOp==0 || a
2450: 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70  ddr<0 || addr>=p
2460: 2d 3e 6e 4f 70 20 29 20 72 65 74 75 72 6e 3b 0a  ->nOp ) return;.
2470: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
2480: 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70  addr];.  if( pOp
2490: 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49  ->p3type==P3_POI
24a0: 4e 54 45 52 20 29 7b 0a 20 20 20 20 72 65 74 75  NTER ){.    retu
24b0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f  rn;.  }.  if( pO
24c0: 70 2d 3e 70 33 74 79 70 65 21 3d 50 33 5f 44 59  p->p3type!=P3_DY
24d0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 4f 70  NAMIC ){.    pOp
24e0: 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72  ->p3 = sqliteStr
24f0: 44 75 70 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  Dup(pOp->p3);.  
2500: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
2510: 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a  P3_DYNAMIC;.  }.
2520: 20 20 7a 20 3d 20 28 75 6e 73 69 67 6e 65 64 20    z = (unsigned 
2530: 63 68 61 72 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20  char*)pOp->p3;. 
2540: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
2550: 72 6e 3b 0a 20 20 69 20 3d 20 6a 20 3d 20 30 3b  rn;.  i = j = 0;
2560: 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63  .  while( isspac
2570: 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  e(z[i]) ){ i++; 
2580: 7d 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20  }.  while( z[i] 
2590: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  ){.    if( isspa
25a0: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
25b0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
25c0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73        while( iss
25d0: 70 61 63 65 28 7a 5b 2b 2b 69 5d 29 20 29 7b 7d  pace(z[++i]) ){}
25e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25f0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 2b 2b    z[j++] = z[i++
2600: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  ];.    }.  }.  w
2610: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 69 73 73  hile( j>0 && iss
2620: 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20  pace(z[j-1]) ){ 
2630: 6a 2d 2d 3b 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  j--; }.  z[j] = 
2640: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  0;.}../*.** Sear
2650: 63 68 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ch for the curre
2660: 6e 74 20 70 72 6f 67 72 61 6d 20 66 6f 72 20 74  nt program for t
2670: 68 65 20 67 69 76 65 6e 20 6f 70 63 6f 64 65 20  he given opcode 
2680: 61 6e 64 20 50 32 0a 2a 2a 20 76 61 6c 75 65 2e  and P2.** value.
2690: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64    Return the add
26a0: 72 65 73 73 20 70 6c 75 73 20 31 20 69 66 20 66  ress plus 1 if f
26b0: 6f 75 6e 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  ound and 0 if no
26c0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
26d0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 4f  sqlite3VdbeFindO
26e0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  p(Vdbe *p, int o
26f0: 70 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  p, int p2){.  in
2700: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
2710: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2720: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 66 6f  GIC_INIT );.  fo
2730: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
2740: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2750: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d  ->aOp[i].opcode=
2760: 3d 6f 70 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  =op && p->aOp[i]
2770: 2e 70 32 3d 3d 70 32 20 29 20 72 65 74 75 72 6e  .p2==p2 ) return
2780: 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   i+1;.  }.  retu
2790: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
27a0: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
27b0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
27c0: 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  ress..*/.VdbeOp 
27d0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
27e0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
27f0: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
2800: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2810: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
2820: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
2830: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
2840: 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f  .  return &p->aO
2850: 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  p[addr];.}../*.*
2860: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2870: 67 72 6f 75 70 20 6f 72 20 72 6f 75 74 69 6e 65  group or routine
2880: 73 20 61 72 65 20 65 6d 70 6c 6f 79 65 64 20 62  s are employed b
2890: 79 20 69 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75  y installable fu
28a0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65  nctions.** to re
28b0: 74 75 72 6e 20 74 68 65 69 72 20 72 65 73 75 6c  turn their resul
28c0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  ts..**.** The sq
28d0: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
28e0: 73 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  string() routine
28f0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2900: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 0a  return a string.
2910: 2a 2a 20 76 61 6c 75 65 20 6f 72 20 74 6f 20 72  ** value or to r
2920: 65 74 75 72 6e 20 61 20 4e 55 4c 4c 2e 20 20 54  eturn a NULL.  T
2930: 6f 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 2c  o return a NULL,
2940: 20 70 61 73 73 20 69 6e 20 4e 55 4c 4c 20 66 6f   pass in NULL fo
2950: 72 20 7a 52 65 73 75 6c 74 2e 0a 2a 2a 20 41 20  r zResult..** A 
2960: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
2970: 74 68 65 20 73 74 72 69 6e 67 20 62 65 66 6f 72  the string befor
2980: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
2990: 65 74 75 72 6e 73 20 73 6f 20 69 74 20 69 73 20  eturns so it is 
29a0: 73 61 66 65 0a 2a 2a 20 74 6f 20 70 61 73 73 20  safe.** to pass 
29b0: 69 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  in an ephemeral 
29c0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 73 71  string..**.** sq
29d0: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
29e0: 65 72 72 6f 72 28 29 20 77 6f 72 6b 73 20 6c 69  error() works li
29f0: 6b 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65  ke sqlite_set_re
2a00: 73 75 6c 74 5f 73 74 72 69 6e 67 28 29 20 65 78  sult_string() ex
2a10: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
2a20: 73 69 67 6e 61 6c 73 20 61 20 66 61 74 61 6c 20  signals a fatal 
2a30: 65 72 72 6f 72 2e 20 20 54 68 65 20 73 74 72 69  error.  The stri
2a40: 6e 67 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  ng argument, if 
2a50: 61 6e 79 2c 20 69 73 20 74 68 65 0a 2a 2a 20 65  any, is the.** e
2a60: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 49  rror message.  I
2a70: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
2a80: 73 20 4e 55 4c 4c 20 61 20 67 65 6e 65 72 69 63  s NULL a generic
2a90: 20 73 75 62 73 74 69 74 75 74 65 20 65 72 72 6f   substitute erro
2aa0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
2ab0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
2ac0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
2ad0: 74 5f 69 6e 74 28 29 20 61 6e 64 20 73 71 6c 69  t_int() and sqli
2ae0: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f  te_set_result_do
2af0: 75 62 6c 65 28 29 20 73 65 74 20 74 68 65 20 72  uble() set the r
2b00: 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f  eturn.** value o
2b10: 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
2b20: 69 6f 6e 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ion to an intege
2b30: 72 20 6f 72 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  r or a double..*
2b40: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
2b50: 6e 65 73 20 61 72 65 20 64 65 66 69 6e 65 64 20  nes are defined 
2b60: 68 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62  here in vdbe.c b
2b70: 65 63 61 75 73 65 20 74 68 65 79 20 64 65 70 65  ecause they depe
2b80: 6e 64 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a  nd on knowing.**
2b90: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f   the internals o
2ba0: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e  f the sqlite_fun
2bb0: 63 20 73 74 72 75 63 74 75 72 65 20 77 68 69 63  c structure whic
2bc0: 68 20 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65  h is only define
2bd0: 64 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20 73 6f  d in .** this so
2be0: 75 72 63 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 68  urce file..*/.ch
2bf0: 61 72 20 2a 73 71 6c 69 74 65 5f 73 65 74 5f 72  ar *sqlite_set_r
2c00: 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 73 71 6c  esult_string(sql
2c10: 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20 63 6f 6e  ite_func *p, con
2c20: 73 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  st char *zResult
2c30: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65  , int n){.  asse
2c40: 72 74 28 20 21 70 2d 3e 69 73 53 74 65 70 20 29  rt( !p->isStep )
2c50: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e 66 6c 61  ;.  if( p->s.fla
2c60: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a  gs & MEM_Dyn ){.
2c70: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2c80: 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ->s.z);.  }.  if
2c90: 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20 29 7b 0a  ( zResult==0 ){.
2ca0: 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67 73 20 3d      p->s.flags =
2cb0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 6e   MEM_Null;.    n
2cc0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 2e 7a   = 0;.    p->s.z
2cd0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 2e 6e   = 0;.    p->s.n
2ce0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2cf0: 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d     if( n<0 ) n =
2d00: 20 73 74 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29   strlen(zResult)
2d10: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 4e 42 46 53  ;.    if( n<NBFS
2d20: 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  -1 ){.      memc
2d30: 70 79 28 70 2d 3e 73 2e 7a 53 68 6f 72 74 2c 20  py(p->s.zShort, 
2d40: 7a 52 65 73 75 6c 74 2c 20 6e 29 3b 0a 20 20 20  zResult, n);.   
2d50: 20 20 20 70 2d 3e 73 2e 7a 53 68 6f 72 74 5b 6e     p->s.zShort[n
2d60: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  ] = 0;.      p->
2d70: 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  s.flags = MEM_St
2d80: 72 20 7c 20 4d 45 4d 5f 53 68 6f 72 74 3b 0a 20  r | MEM_Short;. 
2d90: 20 20 20 20 20 70 2d 3e 73 2e 7a 20 3d 20 70 2d       p->s.z = p-
2da0: 3e 73 2e 7a 53 68 6f 72 74 3b 0a 20 20 20 20 7d  >s.zShort;.    }
2db0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 73  else{.      p->s
2dc0: 2e 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  .z = sqliteMallo
2dd0: 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a 20 20 20  cRaw( n+1 );.   
2de0: 20 20 20 69 66 28 20 70 2d 3e 73 2e 7a 20 29 7b     if( p->s.z ){
2df0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2e00: 70 2d 3e 73 2e 7a 2c 20 7a 52 65 73 75 6c 74 2c  p->s.z, zResult,
2e10: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   n);.        p->
2e20: 73 2e 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  s.z[n] = 0;.    
2e30: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 73 2e 66    }.      p->s.f
2e40: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
2e50: 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 7d 0a   MEM_Dyn;.    }.
2e60: 20 20 20 20 70 2d 3e 73 2e 6e 20 3d 20 6e 2b 31      p->s.n = n+1
2e70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e80: 2d 3e 73 2e 7a 3b 0a 7d 0a 76 6f 69 64 20 73 71  ->s.z;.}.void sq
2e90: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 5f  lite_set_result_
2ea0: 69 6e 74 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  int(sqlite_func 
2eb0: 2a 70 2c 20 69 6e 74 20 69 52 65 73 75 6c 74 29  *p, int iResult)
2ec0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  {.  assert( !p->
2ed0: 69 73 53 74 65 70 20 29 3b 0a 20 20 69 66 28 20  isStep );.  if( 
2ee0: 70 2d 3e 73 2e 66 6c 61 67 73 20 26 20 4d 45 4d  p->s.flags & MEM
2ef0: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  _Dyn ){.    sqli
2f00: 74 65 46 72 65 65 28 70 2d 3e 73 2e 7a 29 3b 0a  teFree(p->s.z);.
2f10: 20 20 7d 0a 20 20 70 2d 3e 73 2e 69 20 3d 20 69    }.  p->s.i = i
2f20: 52 65 73 75 6c 74 3b 0a 20 20 70 2d 3e 73 2e 66  Result;.  p->s.f
2f30: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
2f40: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 73 65  }.void sqlite_se
2f50: 74 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  t_result_double(
2f60: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20  sqlite_func *p, 
2f70: 64 6f 75 62 6c 65 20 72 52 65 73 75 6c 74 29 7b  double rResult){
2f80: 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
2f90: 73 53 74 65 70 20 29 3b 0a 20 20 69 66 28 20 70  sStep );.  if( p
2fa0: 2d 3e 73 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ->s.flags & MEM_
2fb0: 44 79 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Dyn ){.    sqlit
2fc0: 65 46 72 65 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20  eFree(p->s.z);. 
2fd0: 20 7d 0a 20 20 70 2d 3e 73 2e 72 20 3d 20 72 52   }.  p->s.r = rR
2fe0: 65 73 75 6c 74 3b 0a 20 20 70 2d 3e 73 2e 66 6c  esult;.  p->s.fl
2ff0: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
3000: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 73 65  }.void sqlite_se
3010: 74 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 73  t_result_error(s
3020: 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20 63  qlite_func *p, c
3030: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c  onst char *zMsg,
3040: 20 69 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65 72   int n){.  asser
3050: 74 28 20 21 70 2d 3e 69 73 53 74 65 70 20 29 3b  t( !p->isStep );
3060: 0a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65  .  sqlite_set_re
3070: 73 75 6c 74 5f 73 74 72 69 6e 67 28 70 2c 20 7a  sult_string(p, z
3080: 4d 73 67 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69 73  Msg, n);.  p->is
3090: 45 72 72 6f 72 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Error = 1;.}../*
30a0: 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65 20  .** Extract the 
30b0: 75 73 65 72 20 64 61 74 61 20 66 72 6f 6d 20 61  user data from a
30c0: 20 73 71 6c 69 74 65 5f 66 75 6e 63 20 73 74 72   sqlite_func str
30d0: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
30e0: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
30f0: 6f 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  o it..*/.void *s
3100: 71 6c 69 74 65 5f 75 73 65 72 5f 64 61 74 61 28  qlite_user_data(
3110: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b  sqlite_func *p){
3120: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
3130: 70 2d 3e 70 46 75 6e 63 20 29 3b 0a 20 20 72 65  p->pFunc );.  re
3140: 74 75 72 6e 20 70 2d 3e 70 46 75 6e 63 2d 3e 70  turn p->pFunc->p
3150: 55 73 65 72 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a  UserData;.}../*.
3160: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 72  ** Allocate or r
3170: 65 74 75 72 6e 20 74 68 65 20 61 67 67 72 65 67  eturn the aggreg
3180: 61 74 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ate context for 
3190: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e  a user function.
31a0: 20 20 41 20 6e 65 77 0a 2a 2a 20 63 6f 6e 74 65    A new.** conte
31b0: 78 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  xt is allocated 
31c0: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  on the first cal
31d0: 6c 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  l.  Subsequent c
31e0: 61 6c 6c 73 20 72 65 74 75 72 6e 20 74 68 65 0a  alls return the.
31f0: 2a 2a 20 73 61 6d 65 20 63 6f 6e 74 65 78 74 20  ** same context 
3200: 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65  that was returne
3210: 64 20 6f 6e 20 70 72 69 6f 72 20 63 61 6c 6c 73  d on prior calls
3220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3230: 74 69 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20  tine is defined 
3240: 68 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62  here in vdbe.c b
3250: 65 63 61 75 73 65 20 69 74 20 64 65 70 65 6e 64  ecause it depend
3260: 73 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20  s on knowing.** 
3270: 74 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66  the internals of
3280: 20 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63   the sqlite_func
3290: 20 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68   structure which
32a0: 20 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64   is only defined
32b0: 20 69 6e 0a 2a 2a 20 74 68 69 73 20 73 6f 75 72   in.** this sour
32c0: 63 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ce file..*/.void
32d0: 20 2a 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61   *sqlite_aggrega
32e0: 74 65 5f 63 6f 6e 74 65 78 74 28 73 71 6c 69 74  te_context(sqlit
32f0: 65 5f 66 75 6e 63 20 2a 70 2c 20 69 6e 74 20 6e  e_func *p, int n
3300: 42 79 74 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Byte){.  assert(
3310: 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63 20 26   p && p->pFunc &
3320: 26 20 70 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65  & p->pFunc->xSte
3330: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 41  p );.  if( p->pA
3340: 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  gg==0 ){.    if(
3350: 20 6e 42 79 74 65 3c 3d 4e 42 46 53 20 29 7b 0a   nByte<=NBFS ){.
3360: 20 20 20 20 20 20 70 2d 3e 70 41 67 67 20 3d 20        p->pAgg = 
3370: 28 76 6f 69 64 2a 29 70 2d 3e 73 2e 7a 3b 0a 20  (void*)p->s.z;. 
3380: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70       memset(p->p
3390: 41 67 67 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Agg, 0, nByte);.
33a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33b0: 20 70 2d 3e 70 41 67 67 20 3d 20 73 71 6c 69 74   p->pAgg = sqlit
33c0: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
33d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
33e0: 74 75 72 6e 20 70 2d 3e 70 41 67 67 3b 0a 7d 0a  turn p->pAgg;.}.
33f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3400: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
3410: 73 20 74 68 65 20 53 74 65 70 20 66 75 6e 63 74  s the Step funct
3420: 69 6f 6e 20 6f 66 20 61 20 61 67 67 72 65 67 61  ion of a aggrega
3430: 74 65 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a 20  te has been .** 
3440: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
3450: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65  is routine is de
3460: 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20 76 64  fined here in vd
3470: 62 65 2e 63 20 62 65 63 61 75 73 65 20 69 74 20  be.c because it 
3480: 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f 77 69  depends on knowi
3490: 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  ng.** the intern
34a0: 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  als of the sqlit
34b0: 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75 72 65  e_func structure
34c0: 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 20 64   which is only d
34d0: 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69  efined in.** thi
34e0: 73 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a  s source file..*
34f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 61 67 67  /.int sqlite_agg
3500: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 73 71 6c  regate_count(sql
3510: 69 74 65 5f 66 75 6e 63 20 2a 70 29 7b 0a 20 20  ite_func *p){.  
3520: 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
3530: 70 46 75 6e 63 20 26 26 20 70 2d 3e 70 46 75 6e  pFunc && p->pFun
3540: 63 2d 3e 78 53 74 65 70 20 29 3b 0a 20 20 72 65  c->xStep );.  re
3550: 74 75 72 6e 20 70 2d 3e 63 6e 74 3b 0a 7d 0a 0a  turn p->cnt;.}..
3560: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
3570: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
3580: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 2f 2a  VDBE_PROFILE)./*
3590: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
35a0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
35b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
35c0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
35d0: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
35e0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
35f0: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
3600: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
3610: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61  char *zP3;.  cha
3620: 72 20 7a 50 74 72 5b 34 30 5d 3b 0a 20 20 69 66  r zPtr[40];.  if
3630: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50  ( pOp->p3type==P
3640: 33 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  3_POINTER ){.   
3650: 20 73 70 72 69 6e 74 66 28 7a 50 74 72 2c 20 22   sprintf(zPtr, "
3660: 70 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29  ptr(%#x)", (int)
3670: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7a 50  pOp->p3);.    zP
3680: 33 20 3d 20 7a 50 74 72 3b 0a 20 20 7d 65 6c 73  3 = zPtr;.  }els
3690: 65 7b 0a 20 20 20 20 7a 50 33 20 3d 20 70 4f 70  e{.    zP3 = pOp
36a0: 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ->p3;.  }.  if( 
36b0: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
36c0: 20 73 74 64 6f 75 74 3b 0a 20 20 66 70 72 69 6e   stdout;.  fprin
36d0: 74 66 28 70 4f 75 74 2c 22 25 34 64 20 25 2d 31  tf(pOut,"%4d %-1
36e0: 32 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22  2s %4d %4d %s\n"
36f0: 2c 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69  ,.      pc, sqli
3700: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
3710: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70  Op->opcode], pOp
3720: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a  ->p1, pOp->p2, z
3730: 50 33 20 3f 20 7a 50 33 20 3a 20 22 22 29 3b 0a  P3 ? zP3 : "");.
3740: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
3750: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3760: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
3770: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
3780: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
3790: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
37a0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
37b0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
37c0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
37d0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
37e0: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
37f0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
3800: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
3810: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
3820: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
3830: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
3840: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
3850: 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  N"..*/.int sqlit
3860: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
3870: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
3880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
3890: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  DBE */.){.  sqli
38a0: 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  te *db = p->db;.
38b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
38c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
38d0: 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a   static char *az
38e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 5b 5d 20 3d 20  ColumnNames[] = 
38f0: 7b 0a 20 20 20 20 20 22 61 64 64 72 22 2c 20 22  {.     "addr", "
3900: 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 20  opcode", "p1",  
3910: 22 70 32 22 2c 20 20 22 70 33 22 2c 20 0a 20 20  "p2",  "p3", .  
3920: 20 20 20 22 69 6e 74 22 2c 20 20 22 74 65 78 74     "int",  "text
3930: 22 2c 20 20 20 22 69 6e 74 22 2c 20 22 69 6e 74  ",   "int", "int
3940: 22 2c 20 22 74 65 78 74 22 2c 0a 20 20 20 20 20  ", "text",.     
3950: 30 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72 74  0.  };..  assert
3960: 28 20 70 2d 3e 70 6f 70 53 74 61 63 6b 3d 3d 30  ( p->popStack==0
3970: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3980: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 70 2d  >explain );.  p-
3990: 3e 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 61 7a 43  >azColName = azC
39a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 3b 0a 20 20 70 2d  olumnNames;.  p-
39b0: 3e 61 7a 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 70  >azResColumn = p
39c0: 2d 3e 7a 41 72 67 76 3b 0a 20 20 66 6f 72 28 69  ->zArgv;.  for(i
39d0: 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 20 70 2d  =0; i<5; i++) p-
39e0: 3e 7a 41 72 67 76 5b 69 5d 20 3d 20 70 2d 3e 61  >zArgv[i] = p->a
39f0: 53 74 61 63 6b 5b 69 5d 2e 7a 53 68 6f 72 74 3b  Stack[i].zShort;
3a00: 0a 20 20 69 20 3d 20 70 2d 3e 70 63 3b 0a 20 20  .  i = p->pc;.  
3a10: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b  if( i>=p->nOp ){
3a20: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
3a30: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
3a40: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
3a50: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c  }else if( db->fl
3a60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
3a70: 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 64 62  errupt ){.    db
3a80: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3a90: 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20 20  TE_Interrupt;.  
3aa0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21    if( db->magic!
3ab0: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55  =SQLITE_MAGIC_BU
3ac0: 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  SY ){.      p->r
3ad0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  c = SQLITE_MISUS
3ae0: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
3af0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
3b00: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
3b10: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c    }.    rc = SQL
3b20: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
3b30: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
3b40: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
3b50: 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ite_error_string
3b60: 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29  (p->rc), (char*)
3b70: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
3b80: 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a 41 72 67   sprintf(p->zArg
3b90: 76 5b 30 5d 2c 22 25 64 22 2c 69 29 3b 0a 20 20  v[0],"%d",i);.  
3ba0: 20 20 73 70 72 69 6e 74 66 28 70 2d 3e 7a 41 72    sprintf(p->zAr
3bb0: 67 76 5b 32 5d 2c 22 25 64 22 2c 20 70 2d 3e 61  gv[2],"%d", p->a
3bc0: 4f 70 5b 69 5d 2e 70 31 29 3b 0a 20 20 20 20 73  Op[i].p1);.    s
3bd0: 70 72 69 6e 74 66 28 70 2d 3e 7a 41 72 67 76 5b  printf(p->zArgv[
3be0: 33 5d 2c 22 25 64 22 2c 20 70 2d 3e 61 4f 70 5b  3],"%d", p->aOp[
3bf0: 69 5d 2e 70 32 29 3b 0a 20 20 20 20 69 66 28 20  i].p2);.    if( 
3c00: 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 74 79 70 65  p->aOp[i].p3type
3c10: 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  ==P3_POINTER ){.
3c20: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 2d        sprintf(p-
3c30: 3e 61 53 74 61 63 6b 5b 34 5d 2e 7a 53 68 6f 72  >aStack[4].zShor
3c40: 74 2c 20 22 70 74 72 28 25 23 78 29 22 2c 20 28  t, "ptr(%#x)", (
3c50: 69 6e 74 29 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33  int)p->aOp[i].p3
3c60: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 41 72 67  );.      p->zArg
3c70: 76 5b 34 5d 20 3d 20 70 2d 3e 61 53 74 61 63 6b  v[4] = p->aStack
3c80: 5b 34 5d 2e 7a 53 68 6f 72 74 3b 0a 20 20 20 20  [4].zShort;.    
3c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
3ca0: 7a 41 72 67 76 5b 34 5d 20 3d 20 70 2d 3e 61 4f  zArgv[4] = p->aO
3cb0: 70 5b 69 5d 2e 70 33 3b 0a 20 20 20 20 7d 0a 20  p[i].p3;.    }. 
3cc0: 20 20 20 70 2d 3e 7a 41 72 67 76 5b 31 5d 20 3d     p->zArgv[1] =
3cd0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
3ce0: 6d 65 73 5b 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  mes[p->aOp[i].op
3cf0: 63 6f 64 65 5d 3b 0a 20 20 20 20 70 2d 3e 70 63  code];.    p->pc
3d00: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 70 2d 3e 61   = i+1;.    p->a
3d10: 7a 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  zResColumn = p->
3d20: 7a 41 72 67 76 3b 0a 20 20 20 20 70 2d 3e 6e 52  zArgv;.    p->nR
3d30: 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 3b 0a 20 20  esColumn = 5;.  
3d40: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
3d50: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
3d60: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
3d70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3d80: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
3d90: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
3da0: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
3db0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
3dc0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
3dd0: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
3de0: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
3df0: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
3e00: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
3e10: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
3e20: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
3e30: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
3e40: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
3e50: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
3e60: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
3e70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3e80: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
3e90: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3eb0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
3ec0: 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20  int nVar,       
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ee0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20  * Number of '?' 
3ef0: 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73  see in the SQL s
3f00: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
3f10: 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20  t isExplain     
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f30: 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c  True if the EXPL
3f40: 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20  AIN keywords is 
3f50: 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  present */.){.  
3f60: 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  int n;..  assert
3f70: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
3f80: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3f90: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3fa0: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 20 48 41 4c  ..  /* Add a HAL
3fb0: 54 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  T instruction to
3fc0: 20 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66   the very end of
3fd0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20   the program..  
3fe0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d  */.  if( p->nOp=
3ff0: 3d 30 20 7c 7c 20 28 70 2d 3e 61 4f 70 20 26 26  =0 || (p->aOp &&
4000: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4010: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 48 61 6c  ].opcode!=OP_Hal
4020: 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
4030: 33 56 64 62 65 41 64 64 4f 70 28 70 2c 20 4f 50  3VdbeAddOp(p, OP
4040: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
4050: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72  }..  /* No instr
4060: 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75 73 68  uction ever push
4070: 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 73  es more than a s
4080: 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e  ingle element on
4090: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63  to the.  ** stac
40a0: 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74 61 63  k.  And the stac
40b0: 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20 6f 6e  k never grows on
40c0: 20 73 75 63 63 65 73 73 69 76 65 20 65 78 65 63   successive exec
40d0: 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  utions of the.  
40e0: 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53  ** same loop.  S
40f0: 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
4100: 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  er of instructio
4110: 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72 20 62  ns is an upper b
4120: 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ound.  ** on the
4130: 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20 64   maximum stack d
4140: 65 70 74 68 20 72 65 71 75 69 72 65 64 2e 0a 20  epth required.. 
4150: 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   **.  ** Allocat
4160: 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63  ion all the stac
4170: 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20  k space we will 
4180: 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a  ever need..  */.
4190: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d    if( p->aStack=
41a0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  =0 ){.    p->nVa
41b0: 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 61 73  r = nVar;.    as
41c0: 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b  sert( nVar>=0 );
41d0: 0a 20 20 20 20 6e 20 3d 20 69 73 45 78 70 6c 61  .    n = isExpla
41e0: 69 6e 20 3f 20 31 30 20 3a 20 70 2d 3e 6e 4f 70  in ? 10 : p->nOp
41f0: 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20  ;.    p->aStack 
4200: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 0a  = sqliteMalloc(.
4210: 20 20 20 20 20 20 6e 2a 28 73 69 7a 65 6f 66 28        n*(sizeof(
4220: 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20 2b 20  p->aStack[0]) + 
4230: 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 29  2*sizeof(char*))
4240: 20 20 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 61       /* aStack a
4250: 6e 64 20 7a 41 72 67 76 20 2a 2f 0a 20 20 20 20  nd zArgv */.    
4260: 20 20 20 20 2b 20 70 2d 3e 6e 56 61 72 2a 28 73      + p->nVar*(s
4270: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 73 69 7a  izeof(char*)+siz
4280: 65 6f 66 28 69 6e 74 29 2b 31 29 20 20 20 20 2f  eof(int)+1)    /
4290: 2a 20 61 7a 56 61 72 2c 20 61 6e 56 61 72 2c 20  * azVar, anVar, 
42a0: 61 62 56 61 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  abVar */.    );.
42b0: 20 20 20 20 70 2d 3e 7a 41 72 67 76 20 3d 20 28      p->zArgv = (
42c0: 63 68 61 72 2a 2a 29 26 70 2d 3e 61 53 74 61 63  char**)&p->aStac
42d0: 6b 5b 6e 5d 3b 0a 20 20 20 20 70 2d 3e 61 7a 43  k[n];.    p->azC
42e0: 6f 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 2a  olName = (char**
42f0: 29 26 70 2d 3e 7a 41 72 67 76 5b 6e 5d 3b 0a 20  )&p->zArgv[n];. 
4300: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63     p->azVar = (c
4310: 68 61 72 2a 2a 29 26 70 2d 3e 61 7a 43 6f 6c 4e  har**)&p->azColN
4320: 61 6d 65 5b 6e 5d 3b 0a 20 20 20 20 70 2d 3e 61  ame[n];.    p->a
4330: 6e 56 61 72 20 3d 20 28 69 6e 74 2a 29 26 70 2d  nVar = (int*)&p-
4340: 3e 61 7a 56 61 72 5b 70 2d 3e 6e 56 61 72 5d 3b  >azVar[p->nVar];
4350: 0a 20 20 20 20 70 2d 3e 61 62 56 61 72 20 3d 20  .    p->abVar = 
4360: 28 75 38 2a 29 26 70 2d 3e 61 6e 56 61 72 5b 70  (u8*)&p->anVar[p
4370: 2d 3e 6e 56 61 72 5d 3b 0a 20 20 7d 0a 0a 20 20  ->nVar];.  }..  
4380: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
4390: 26 70 2d 3e 61 67 67 2e 68 61 73 68 2c 20 53 51  &p->agg.hash, SQ
43a0: 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59  LITE_HASH_BINARY
43b0: 2c 20 30 29 3b 0a 20 20 70 2d 3e 61 67 67 2e 70  , 0);.  p->agg.p
43c0: 53 65 61 72 63 68 20 3d 20 30 3b 0a 23 69 66 64  Search = 0;.#ifd
43d0: 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0a  ef MEMORY_DEBUG.
43e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
43f0: 69 6c 65 45 78 69 73 74 73 28 22 76 64 62 65 5f  ileExists("vdbe_
4400: 74 72 61 63 65 22 29 20 29 7b 0a 20 20 20 20 70  trace") ){.    p
4410: 2d 3e 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  ->trace = stdout
4420: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
4430: 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74  ->pTos = &p->aSt
4440: 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63  ack[-1];.  p->pc
4450: 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20   = 0;.  p->rc = 
4460: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
4470: 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20  uniqueCnt = 0;. 
4480: 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20   p->returnDepth 
4490: 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  = 0;.  p->errorA
44a0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
44b0: 3b 0a 20 20 70 2d 3e 75 6e 64 6f 54 72 61 6e 73  ;.  p->undoTrans
44c0: 4f 6e 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 70  OnError = 0;.  p
44d0: 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b  ->popStack =  0;
44e0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
44f0: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
4500: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
4510: 47 49 43 5f 52 55 4e 3b 0a 23 69 66 64 65 66 20  GIC_RUN;.#ifdef 
4520: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
4530: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4540: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
4550: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
4560: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
4570: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
4580: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
4590: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
45a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  .../*.** Remove 
45b0: 61 6e 79 20 65 6c 65 6d 65 6e 74 73 20 74 68 61  any elements tha
45c0: 74 20 72 65 6d 61 69 6e 20 6f 6e 20 74 68 65 20  t remain on the 
45d0: 73 6f 72 74 65 72 20 66 6f 72 20 74 68 65 20 56  sorter for the V
45e0: 44 42 45 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  DBE given..*/.vo
45f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  id sqlite3VdbeSo
4600: 72 74 65 72 52 65 73 65 74 28 56 64 62 65 20 2a  rterReset(Vdbe *
4610: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  p){.  while( p->
4620: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 53 6f 72  pSort ){.    Sor
4630: 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70  ter *pSorter = p
4640: 2d 3e 70 53 6f 72 74 3b 0a 20 20 20 20 70 2d 3e  ->pSort;.    p->
4650: 70 53 6f 72 74 20 3d 20 70 53 6f 72 74 65 72 2d  pSort = pSorter-
4660: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4670: 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e  teFree(pSorter->
4680: 7a 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  zKey);.    sqlit
4690: 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 70  eFree(pSorter->p
46a0: 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
46b0: 65 46 72 65 65 28 70 53 6f 72 74 65 72 29 3b 0a  eFree(pSorter);.
46c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
46d0: 65 74 20 61 6e 20 41 67 67 20 73 74 72 75 63 74  et an Agg struct
46e0: 75 72 65 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c  ure.  Delete all
46f0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 0a   its contents. .
4700: 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 73 74 61 6c  **.** For instal
4710: 6c 61 62 6c 65 20 61 67 67 72 65 67 61 74 65 20  lable aggregate 
4720: 66 75 6e 63 74 69 6f 6e 73 2c 20 69 66 20 74 68  functions, if th
4730: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e step function 
4740: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 63 61 6c 6c  has been.** call
4750: 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ed, make sure th
4760: 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63  e finalizer func
4770: 74 69 6f 6e 20 68 61 73 20 61 6c 73 6f 20 62 65  tion has also be
4780: 65 6e 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 0a  en called.  The.
4790: 2a 2a 20 66 69 6e 61 6c 69 7a 65 72 20 6d 69 67  ** finalizer mig
47a0: 68 74 20 6e 65 65 64 20 74 6f 20 66 72 65 65 20  ht need to free 
47b0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
47c0: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72  allocated as par
47d0: 74 20 6f 66 20 69 74 73 0a 2a 2a 20 70 72 69 76  t of its.** priv
47e0: 61 74 65 20 63 6f 6e 74 65 78 74 2e 20 20 49 66  ate context.  If
47f0: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 68   the finalizer h
4800: 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 61 6c 6c  as not been call
4810: 65 64 20 79 65 74 2c 20 63 61 6c 6c 20 69 74 0a  ed yet, call it.
4820: 2a 2a 20 6e 6f 77 2e 0a 2a 2f 0a 76 6f 69 64 20  ** now..*/.void 
4830: 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 52 65  sqlite3VdbeAggRe
4840: 73 65 74 28 41 67 67 20 2a 70 41 67 67 29 7b 0a  set(Agg *pAgg){.
4850: 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45    int i;.  HashE
4860: 6c 65 6d 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  lem *p;.  for(p 
4870: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  = sqliteHashFirs
4880: 74 28 26 70 41 67 67 2d 3e 68 61 73 68 29 3b 20  t(&pAgg->hash); 
4890: 70 3b 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73  p; p = sqliteHas
48a0: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 41  hNext(p)){.    A
48b0: 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d 20  ggElem *pElem = 
48c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
48d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
48e0: 41 67 67 2d 3e 61 70 46 75 6e 63 21 3d 30 20 29  Agg->apFunc!=0 )
48f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4900: 3c 70 41 67 67 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  <pAgg->nMem; i++
4910: 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d  ){.      Mem *pM
4920: 65 6d 20 3d 20 26 70 45 6c 65 6d 2d 3e 61 4d 65  em = &pElem->aMe
4930: 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[i];.      if( 
4940: 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 20  pAgg->apFunc[i] 
4950: 26 26 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  && (pMem->flags 
4960: 26 20 4d 45 4d 5f 41 67 67 43 74 78 29 21 3d 30  & MEM_AggCtx)!=0
4970: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4980: 74 65 5f 66 75 6e 63 20 63 74 78 3b 0a 20 20 20  te_func ctx;.   
4990: 20 20 20 20 20 63 74 78 2e 70 46 75 6e 63 20 3d       ctx.pFunc =
49a0: 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d   pAgg->apFunc[i]
49b0: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 73 2e  ;.        ctx.s.
49c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
49d0: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 70 41  ;.        ctx.pA
49e0: 67 67 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  gg = pMem->z;.  
49f0: 20 20 20 20 20 20 63 74 78 2e 63 6e 74 20 3d 20        ctx.cnt = 
4a00: 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 20 20 20  pMem->i;.       
4a10: 20 63 74 78 2e 69 73 53 74 65 70 20 3d 20 30 3b   ctx.isStep = 0;
4a20: 0a 20 20 20 20 20 20 20 20 63 74 78 2e 69 73 45  .        ctx.isE
4a30: 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rror = 0;.      
4a40: 20 20 28 2a 70 41 67 67 2d 3e 61 70 46 75 6e 63    (*pAgg->apFunc
4a50: 5b 69 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65 29 28  [i]->xFinalize)(
4a60: 26 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 69  &ctx);.        i
4a70: 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 26 26  f( pMem->z!=0 &&
4a80: 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d 3e   pMem->z!=pMem->
4a90: 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  zShort ){.      
4aa0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4ab0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
4ac0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
4ad0: 74 78 2e 73 2e 66 6c 61 67 73 20 26 20 4d 45 4d  tx.s.flags & MEM
4ae0: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  _Dyn ){.        
4af0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 63 74 78    sqliteFree(ctx
4b00: 2e 73 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  .s.z);.        }
4b10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4b20: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
4b30: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
4b40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4d 65    sqliteFree(pMe
4b50: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m->z);.      }. 
4b60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
4b70: 72 65 65 28 70 45 6c 65 6d 29 3b 0a 20 20 7d 0a  ree(pElem);.  }.
4b80: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
4b90: 61 72 28 26 70 41 67 67 2d 3e 68 61 73 68 29 3b  ar(&pAgg->hash);
4ba0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 41  .  sqliteFree(pA
4bb0: 67 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20 20 70  gg->apFunc);.  p
4bc0: 41 67 67 2d 3e 61 70 46 75 6e 63 20 3d 20 30 3b  Agg->apFunc = 0;
4bd0: 0a 20 20 70 41 67 67 2d 3e 70 43 75 72 72 65 6e  .  pAgg->pCurren
4be0: 74 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e 70  t = 0;.  pAgg->p
4bf0: 53 65 61 72 63 68 20 3d 20 30 3b 0a 20 20 70 41  Search = 0;.  pA
4c00: 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a  gg->nMem = 0;.}.
4c10: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
4c20: 6b 65 79 6c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  keylist.*/.void 
4c30: 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c 69  sqlite3VdbeKeyli
4c40: 73 74 46 72 65 65 28 4b 65 79 6c 69 73 74 20 2a  stFree(Keylist *
4c50: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  p){.  while( p )
4c60: 7b 0a 20 20 20 20 4b 65 79 6c 69 73 74 20 2a 70  {.    Keylist *p
4c70: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
4c80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4c90: 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 78  p);.    p = pNex
4ca0: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
4cb0: 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61  Close a cursor a
4cc0: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
4cd0: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
4ce0: 74 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73  t cursor happens
4cf0: 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  .** to hold..*/.
4d00: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4d10: 43 6c 65 61 6e 75 70 43 75 72 73 6f 72 28 43 75  CleanupCursor(Cu
4d20: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
4d30: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
4d40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
4d50: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
4d60: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
4d70: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
4d80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
4d90: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
4da0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
4db0: 46 72 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29  Free(pCx->pData)
4dc0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 78 2c 20  ;.  memset(pCx, 
4dd0: 30 2c 20 73 69 7a 65 6f 66 28 43 75 72 73 6f 72  0, sizeof(Cursor
4de0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
4df0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a  se all cursors.*
4e00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
4e10: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
4e20: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
4e30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4e40: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
4e50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4e60: 6c 65 61 6e 75 70 43 75 72 73 6f 72 28 26 70 2d  leanupCursor(&p-
4e70: 3e 61 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  >aCsr[i]);.  }. 
4e80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61   sqliteFree(p->a
4e90: 43 73 72 29 3b 0a 20 20 70 2d 3e 61 43 73 72 20  Csr);.  p->aCsr 
4ea0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f  = 0;.  p->nCurso
4eb0: 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
4ec0: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
4ed0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
4ee0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4ef0: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
4f00: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
4f10: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
4f20: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
4f30: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
4f40: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
4f50: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
4f60: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
4f70: 6c 65 73 20 69 6e 20 74 68 65 20 61 7a 56 61 72  les in the azVar
4f80: 69 61 62 6c 65 5b 5d 20 61 72 72 61 79 2e 0a 2a  iable[] array..*
4f90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
4fa0: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
4fb0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
4fc0: 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  ->aStack ){.    
4fd0: 4d 65 6d 20 2a 70 54 6f 73 20 3d 20 70 2d 3e 70  Mem *pTos = p->p
4fe0: 54 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  Tos;.    while( 
4ff0: 70 54 6f 73 3e 3d 70 2d 3e 61 53 74 61 63 6b 20  pTos>=p->aStack 
5000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  ){.      if( pTo
5010: 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  s->flags & MEM_D
5020: 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  yn ){.        sq
5030: 6c 69 74 65 46 72 65 65 28 70 54 6f 73 2d 3e 7a  liteFree(pTos->z
5040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5050: 20 70 54 6f 73 2d 2d 3b 0a 20 20 20 20 7d 0a 20   pTos--;.    }. 
5060: 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 54 6f     p->pTos = pTo
5070: 73 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  s;.  }.  closeAl
5080: 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
5090: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
50a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
50b0: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
50c0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d    if( p->aMem[i]
50d0: 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  .flags & MEM_Dyn
50e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
50f0: 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d 5b 69  teFree(p->aMem[i
5100: 5d 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ].z);.      }.  
5110: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
5120: 46 72 65 65 28 70 2d 3e 61 4d 65 6d 29 3b 0a 20  Free(p->aMem);. 
5130: 20 70 2d 3e 61 4d 65 6d 20 3d 20 30 3b 0a 20 20   p->aMem = 0;.  
5140: 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 69  p->nMem = 0;.  i
5150: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  f( p->pList ){. 
5160: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65     sqlite3VdbeKe
5170: 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 70 4c 69  ylistFree(p->pLi
5180: 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 73  st);.    p->pLis
5190: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
51a0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 65  ite3VdbeSorterRe
51b0: 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  set(p);.  if( p-
51c0: 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66  >pFile ){.    if
51d0: 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73 74 64 69  ( p->pFile!=stdi
51e0: 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d 3e 70 46  n ) fclose(p->pF
51f0: 69 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 69  ile);.    p->pFi
5200: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  le = 0;.  }.  if
5210: 28 20 70 2d 3e 61 7a 46 69 65 6c 64 20 29 7b 0a  ( p->azField ){.
5220: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
5230: 2d 3e 61 7a 46 69 65 6c 64 29 3b 0a 20 20 20 20  ->azField);.    
5240: 70 2d 3e 61 7a 46 69 65 6c 64 20 3d 20 30 3b 0a  p->azField = 0;.
5250: 20 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20    }.  p->nField 
5260: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4c  = 0;.  if( p->zL
5270: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
5280: 65 46 72 65 65 28 70 2d 3e 7a 4c 69 6e 65 29 3b  eFree(p->zLine);
5290: 0a 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20  .    p->zLine = 
52a0: 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 69 6e  0;.  }.  p->nLin
52b0: 65 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 73 71  eAlloc = 0;.  sq
52c0: 6c 69 74 65 33 56 64 62 65 41 67 67 52 65 73 65  lite3VdbeAggRese
52d0: 74 28 26 70 2d 3e 61 67 67 29 3b 0a 20 20 69 66  t(&p->agg);.  if
52e0: 28 20 70 2d 3e 61 53 65 74 20 29 7b 0a 20 20 20  ( p->aSet ){.   
52f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5300: 53 65 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Set; i++){.     
5310: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
5320: 72 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e 68 61  r(&p->aSet[i].ha
5330: 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sh);.    }.  }. 
5340: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61   sqliteFree(p->a
5350: 53 65 74 29 3b 0a 20 20 70 2d 3e 61 53 65 74 20  Set);.  p->aSet 
5360: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 53 65 74 20 3d  = 0;.  p->nSet =
5370: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6b 65 79   0;.  if( p->key
5380: 6c 69 73 74 53 74 61 63 6b 20 29 7b 0a 20 20 20  listStack ){.   
5390: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
53a0: 28 69 69 20 3d 20 30 3b 20 69 69 20 3c 20 70 2d  (ii = 0; ii < p-
53b0: 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70  >keylistStackDep
53c0: 74 68 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  th; ii++){.     
53d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c   sqlite3VdbeKeyl
53e0: 69 73 74 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69  istFree(p->keyli
53f0: 73 74 53 74 61 63 6b 5b 69 69 5d 29 3b 0a 20 20  stStack[ii]);.  
5400: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
5410: 65 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61  ee(p->keylistSta
5420: 63 6b 29 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c  ck);.    p->keyl
5430: 69 73 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20  istStackDepth = 
5440: 30 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c 69 73  0;.    p->keylis
5450: 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a  tStack = 0;.  }.
5460: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
5470: 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20  contextStack);. 
5480: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
5490: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72   = 0;.  sqliteFr
54a0: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  ee(p->zErrMsg);.
54b0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
54c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
54d0: 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
54e0: 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
54f0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
5500: 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
5510: 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
5520: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
5530: 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
5540: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
5550: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
5560: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5570: 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
5580: 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
5590: 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
55a0: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73   again..*/.int s
55b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
55c0: 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20 2a 2a  Vdbe *p, char **
55d0: 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c  pzErrMsg){.  sql
55e0: 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  ite *db = p->db;
55f0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
5600: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
5610: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
5620: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
5630: 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 73 71  C_HALT ){.    sq
5640: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 70  lite3SetString(p
5650: 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f  zErrMsg, sqlite_
5660: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 51 4c  error_string(SQL
5670: 49 54 45 5f 4d 49 53 55 53 45 29 2c 20 28 63 68  ITE_MISUSE), (ch
5680: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
5690: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
56a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
56b0: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 69 66  ErrMsg ){.    if
56c0: 28 20 70 7a 45 72 72 4d 73 67 20 26 26 20 2a 70  ( pzErrMsg && *p
56d0: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b 0a 20 20  zErrMsg==0 ){.  
56e0: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
56f0: 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20  p->zErrMsg;.    
5700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
5710: 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d  iteFree(p->zErrM
5720: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  sg);.    }.    p
5730: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
5740: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
5750: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
5760: 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73  etString(pzErrMs
5770: 67 2c 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f  g, sqlite_error_
5780: 73 74 72 69 6e 67 28 70 2d 3e 72 63 29 2c 20 28  string(p->rc), (
5790: 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  char*)0);.  }.  
57a0: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66  Cleanup(p);.  if
57b0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
57c0: 4f 4b 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  OK ){.    switch
57d0: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
57e0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
57f0: 45 5f 41 62 6f 72 74 3a 20 7b 0a 20 20 20 20 20  E_Abort: {.     
5800: 20 20 20 69 66 28 20 21 70 2d 3e 75 6e 64 6f 54     if( !p->undoT
5810: 72 61 6e 73 4f 6e 45 72 72 6f 72 20 29 7b 0a 20  ransOnError ){. 
5820: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
5830: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
5840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
5850: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
5860: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
5870: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
5880: 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 64 62 2d 3e  ollbackStmt(db->
5890: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
58a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
58b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
58c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
58d0: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c  }.        /* Fal
58e0: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 52 4f 4c  l through to ROL
58f0: 4c 42 41 43 4b 20 2a 2f 0a 20 20 20 20 20 20 7d  LBACK */.      }
5900: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52  .      case OE_R
5910: 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20  ollback: {.     
5920: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
5930: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
5940: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
5950: 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
5960: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6f 6e 45  .        db->onE
5970: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
5980: 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
5990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59a0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
59b0: 20 20 20 69 66 28 20 70 2d 3e 75 6e 64 6f 54 72     if( p->undoTr
59c0: 61 6e 73 4f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  ansOnError ){.  
59d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
59e0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
59f0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5a00: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
5a10: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 20 20 20 20  nTrans;.        
5a20: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
5a30: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  OE_Default;.    
5a40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5a50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5a60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f   }.    sqlite3Ro
5a70: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
5a80: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 20  anges(db);.  }. 
5a90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
5aa0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
5ab0: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
5ac0: 74 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  t && db->aDb[i].
5ad0: 69 6e 54 72 61 6e 73 3d 3d 32 20 29 7b 0a 20 20  inTrans==2 ){.  
5ae0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
5af0: 43 6f 6d 6d 69 74 53 74 6d 74 28 64 62 2d 3e 61  CommitStmt(db->a
5b00: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
5b10: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54    db->aDb[i].inT
5b20: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rans = 1;.    }.
5b30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5b40: 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b  >pTos<&p->aStack
5b50: 5b 70 2d 3e 70 63 5d 20 7c 7c 20 73 71 6c 69 74  [p->pc] || sqlit
5b60: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3d  e_malloc_failed=
5b70: 3d 31 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42  =1 );.#ifdef VDB
5b80: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
5b90: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
5ba0: 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
5bb0: 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
5bc0: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
5bd0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
5be0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
5bf0: 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
5c00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
5c10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
5c20: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
5c30: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
5c40: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
5c50: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5c60: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
5c70: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
5c80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
5c90: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
5ca0: 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
5cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
5cc0: 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
5cd0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
5ce0: 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
5cf0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
5d00: 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
5d10: 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
5d20: 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
5d30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5d40: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
5d50: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
5d60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5d70: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
5d80: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
5d90: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
5da0: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
5db0: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
5dc0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
5dd0: 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
5de0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
5df0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
5e00: 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
5e10: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
5e20: 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
5e30: 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
5e40: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
5e50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5e60: 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
5e70: 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  *p, char **pzErr
5e80: 4d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Msg){.  int rc;.
5e90: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
5ea0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
5eb0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
5ec0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
5ed0: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
5ee0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
5ef0: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c  ng(pzErrMsg, sql
5f00: 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ite_error_string
5f10: 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 2c  (SQLITE_MISUSE),
5f20: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
5f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5f40: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  SUSE;.  }.  db =
5f50: 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73   p->db;.  rc = s
5f60: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
5f70: 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  p, pzErrMsg);.  
5f80: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
5f90: 65 28 70 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  e(p);.  if( db->
5fa0: 77 61 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 26 26  want_to_close &&
5fb0: 20 64 62 2d 3e 70 56 64 62 65 3d 3d 30 20 29 7b   db->pVdbe==0 ){
5fc0: 0a 20 20 20 20 73 71 6c 69 74 65 5f 63 6c 6f 73  .    sqlite_clos
5fd0: 65 28 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e(db);.  }.  if(
5fe0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45   rc==SQLITE_SCHE
5ff0: 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MA ){.    sqlite
6000: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
6010: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
6020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6030: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
6040: 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 76 61 72  alues of all var
6050: 69 61 62 6c 65 73 2e 20 20 56 61 72 69 61 62 6c  iables.  Variabl
6060: 65 20 24 31 20 69 6e 20 74 68 65 20 6f 72 69 67  e $1 in the orig
6070: 69 6e 61 6c 20 53 51 4c 20 77 69 6c 6c 0a 2a 2a  inal SQL will.**
6080: 20 62 65 20 74 68 65 20 73 74 72 69 6e 67 20 61   be the string a
6090: 7a 56 61 6c 75 65 5b 30 5d 2e 20 20 24 32 20 77  zValue[0].  $2 w
60a0: 69 6c 6c 20 68 61 76 65 20 74 68 65 20 76 61 6c  ill have the val
60b0: 75 65 20 61 7a 56 61 6c 75 65 5b 31 5d 2e 20 20  ue azValue[1].  
60c0: 41 6e 64 0a 2a 2a 20 73 6f 20 66 6f 72 74 68 2e  And.** so forth.
60d0: 20 20 49 66 20 61 20 76 61 6c 75 65 20 69 73 20    If a value is 
60e0: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 66 6f  out of range (fo
60f0: 72 20 65 78 61 6d 70 6c 65 20 24 33 20 77 68 65  r example $3 whe
6100: 6e 20 6e 56 61 6c 75 65 3d 3d 32 29 0a 2a 2a 20  n nValue==2).** 
6110: 74 68 65 6e 20 69 74 73 20 76 61 6c 75 65 20 77  then its value w
6120: 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ill be NULL..**.
6130: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6140: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
6150: 69 6f 72 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74  ior call..*/.int
6160: 20 73 71 6c 69 74 65 5f 62 69 6e 64 28 73 71 6c   sqlite_bind(sql
6170: 69 74 65 5f 76 6d 20 2a 70 56 6d 2c 20 69 6e 74  ite_vm *pVm, int
6180: 20 69 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   i, const char *
6190: 7a 56 61 6c 2c 20 69 6e 74 20 6c 65 6e 2c 20 69  zVal, int len, i
61a0: 6e 74 20 63 6f 70 79 29 7b 0a 20 20 56 64 62 65  nt copy){.  Vdbe
61b0: 20 2a 70 20 3d 20 28 56 64 62 65 2a 29 70 56 6d   *p = (Vdbe*)pVm
61c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
61d0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
61e0: 20 7c 7c 20 70 2d 3e 70 63 21 3d 30 20 29 7b 0a   || p->pc!=0 ){.
61f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6200: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
6210: 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 70 2d 3e  if( i<1 || i>p->
6220: 6e 56 61 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nVar ){.    retu
6230: 72 6e 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3b  rn SQLITE_RANGE;
6240: 0a 20 20 7d 0a 20 20 69 2d 2d 3b 0a 20 20 69 66  .  }.  i--;.  if
6250: 28 20 70 2d 3e 61 62 56 61 72 5b 69 5d 20 29 7b  ( p->abVar[i] ){
6260: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
6270: 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
6280: 7d 0a 20 20 69 66 28 20 7a 56 61 6c 3d 3d 30 20  }.  if( zVal==0 
6290: 29 7b 0a 20 20 20 20 63 6f 70 79 20 3d 20 30 3b  ){.    copy = 0;
62a0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
62b0: 7d 0a 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b  }.  if( len<0 ){
62c0: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  .    len = strle
62d0: 6e 28 7a 56 61 6c 29 2b 31 3b 0a 20 20 7d 0a 20  n(zVal)+1;.  }. 
62e0: 20 69 66 28 20 63 6f 70 79 20 29 7b 0a 20 20 20   if( copy ){.   
62f0: 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 20 3d 20 73   p->azVar[i] = s
6300: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e  qliteMalloc( len
6310: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   );.    if( p->a
6320: 7a 56 61 72 5b 69 5d 20 29 20 6d 65 6d 63 70 79  zVar[i] ) memcpy
6330: 28 70 2d 3e 61 7a 56 61 72 5b 69 5d 2c 20 7a 56  (p->azVar[i], zV
6340: 61 6c 2c 20 6c 65 6e 29 3b 0a 20 20 7d 65 6c 73  al, len);.  }els
6350: 65 7b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 5b  e{.    p->azVar[
6360: 69 5d 20 3d 20 28 63 68 61 72 2a 29 7a 56 61 6c  i] = (char*)zVal
6370: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 62 56 61 72  ;.  }.  p->abVar
6380: 5b 69 5d 20 3d 20 63 6f 70 79 3b 0a 20 20 70 2d  [i] = copy;.  p-
6390: 3e 61 6e 56 61 72 5b 69 5d 20 3d 20 6c 65 6e 3b  >anVar[i] = len;
63a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
63b0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  _OK;.}.../*.** D
63c0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
63d0: 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
63e0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
63f0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6400: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
6410: 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75  return;.  Cleanu
6420: 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  p(p);.  if( p->p
6430: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
6440: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
6450: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
6460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
6470: 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
6480: 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65      p->db->pVdbe
6490: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
64a0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
64b0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
64c0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
64d0: 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 65  v;.  }.  p->pPre
64e0: 76 20 3d 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  v = p->pNext = 0
64f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c  ;.  if( p->nOpAl
6500: 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  loc==0 ){.    p-
6510: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20 70 2d  >aOp = 0;.    p-
6520: 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  >nOp = 0;.  }.  
6530: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
6540: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  p; i++){.    if(
6550: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 74 79 70   p->aOp[i].p3typ
6560: 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b  e==P3_DYNAMIC ){
6570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6580: 65 28 70 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b  e(p->aOp[i].p3);
6590: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
65a0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 56 61 72 3b  (i=0; i<p->nVar;
65b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
65c0: 2d 3e 61 62 56 61 72 5b 69 5d 20 29 20 73 71 6c  ->abVar[i] ) sql
65d0: 69 74 65 46 72 65 65 28 70 2d 3e 61 7a 56 61 72  iteFree(p->azVar
65e0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
65f0: 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a  teFree(p->aOp);.
6600: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
6610: 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
6620: 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29  eFree(p->aStack)
6630: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
6640: 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
6650: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
6660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
6670: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 20  t an integer in 
6680: 62 65 74 77 65 65 6e 20 74 68 65 20 6e 61 74 69  between the nati
6690: 76 65 20 69 6e 74 65 67 65 72 20 66 6f 72 6d 61  ve integer forma
66a0: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 62 69 67  t and.** the big
66b0: 45 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20 75 73  Endian format us
66c0: 65 64 20 61 73 20 74 68 65 20 72 65 63 6f 72 64  ed as the record
66d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
66e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 69  es..**.** The bi
66f0: 67 45 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20 28  gEndian format (
6700: 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
6710: 20 62 79 74 65 20 66 69 72 73 74 29 20 69 73 20   byte first) is 
6720: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 72 65 63 6f  used for.** reco
6730: 72 64 20 6e 75 6d 62 65 72 73 20 73 6f 20 74 68  rd numbers so th
6740: 61 74 20 72 65 63 6f 72 64 73 20 77 69 6c 6c 20  at records will 
6750: 73 6f 72 74 20 69 6e 74 6f 20 74 68 65 20 63 6f  sort into the co
6760: 72 72 65 63 74 20 6f 72 64 65 72 0a 2a 2a 20 65  rrect order.** e
6770: 76 65 6e 20 74 68 6f 75 67 68 20 6d 65 6d 63 6d  ven though memcm
6780: 70 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 63  p() is used to c
6790: 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 73 2e  ompare the keys.
67a0: 20 20 4f 6e 20 6d 61 63 68 69 6e 65 73 0a 2a 2a    On machines.**
67b0: 20 77 68 6f 73 65 20 6e 61 74 69 76 65 20 69 6e   whose native in
67c0: 74 65 67 65 72 20 66 6f 72 6d 61 74 20 69 73 20  teger format is 
67d0: 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 28 65  little endian (e
67e0: 78 3a 20 69 34 38 36 29 20 74 68 65 0a 2a 2a 20  x: i486) the.** 
67f0: 6f 72 64 65 72 20 6f 66 20 62 79 74 65 73 20 69  order of bytes i
6800: 73 20 72 65 76 65 72 73 65 64 2e 20 20 4f 6e 20  s reversed.  On 
6810: 6e 61 74 69 76 65 20 62 69 67 2d 65 6e 64 69 61  native big-endia
6820: 6e 20 6d 61 63 68 69 6e 65 73 0a 2a 2a 20 28 65  n machines.** (e
6830: 78 3a 20 41 6c 70 68 61 2c 20 53 70 61 72 63 2c  x: Alpha, Sparc,
6840: 20 4d 6f 74 6f 72 6f 6c 61 29 20 74 68 65 20 62   Motorola) the b
6850: 79 74 65 20 6f 72 64 65 72 20 69 73 20 74 68 65  yte order is the
6860: 20 73 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   same..**.** Thi
6870: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 74  s function is it
6880: 73 20 6f 77 6e 20 69 6e 76 65 72 73 65 2e 20 20  s own inverse.  
6890: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 0a 2a  In other words.*
68a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3d  *.**         X =
68b0: 3d 20 62 79 74 65 53 77 61 70 28 62 79 74 65 53  = byteSwap(byteS
68c0: 77 61 70 28 58 29 29 0a 2a 2f 0a 69 6e 74 20 73  wap(X)).*/.int s
68d0: 71 6c 69 74 65 33 56 64 62 65 42 79 74 65 53 77  qlite3VdbeByteSw
68e0: 61 70 28 69 6e 74 20 78 29 7b 0a 20 20 75 6e 69  ap(int x){.  uni
68f0: 6f 6e 20 7b 0a 20 20 20 20 20 63 68 61 72 20 7a  on {.     char z
6900: 42 75 66 5b 73 69 7a 65 6f 66 28 69 6e 74 29 5d  Buf[sizeof(int)]
6910: 3b 0a 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ;.     int i;.  
6920: 7d 20 75 78 3b 0a 20 20 75 78 2e 7a 42 75 66 5b  } ux;.  ux.zBuf[
6930: 33 5d 20 3d 20 78 26 30 78 66 66 3b 0a 20 20 75  3] = x&0xff;.  u
6940: 78 2e 7a 42 75 66 5b 32 5d 20 3d 20 28 78 3e 3e  x.zBuf[2] = (x>>
6950: 38 29 26 30 78 66 66 3b 0a 20 20 75 78 2e 7a 42  8)&0xff;.  ux.zB
6960: 75 66 5b 31 5d 20 3d 20 28 78 3e 3e 31 36 29 26  uf[1] = (x>>16)&
6970: 30 78 66 66 3b 0a 20 20 75 78 2e 7a 42 75 66 5b  0xff;.  ux.zBuf[
6980: 30 5d 20 3d 20 28 78 3e 3e 32 34 29 26 30 78 66  0] = (x>>24)&0xf
6990: 66 3b 0a 20 20 72 65 74 75 72 6e 20 75 78 2e 69  f;.  return ux.i
69a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
69b0: 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
69c0: 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
69d0: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
69e0: 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
69f0: 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65   MoveTo now.  Re
6a00: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
6a10: 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54  de.  If no MoveT
6a20: 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68  o is pending, th
6a30: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f  is.** routine do
6a40: 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72  es nothing and r
6a50: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
6a60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6a70: 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
6a80: 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  (Cursor *p){.  i
6a90: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
6aa0: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
6ab0: 72 65 73 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  res;.    extern 
6ac0: 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 61 72 63  int sqlite_searc
6ad0: 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 73 71 6c  h_count;.    sql
6ae0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
6af0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 28 63 68 61  p->pCursor, (cha
6b00: 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  r*)&p->movetoTar
6b10: 67 65 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  get, sizeof(int)
6b20: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 2d 3e  , &res);.    p->
6b30: 6c 61 73 74 52 65 63 6e 6f 20 3d 20 6b 65 79 54  lastRecno = keyT
6b40: 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61  oInt(p->movetoTa
6b50: 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 65  rget);.    p->re
6b60: 63 6e 6f 49 73 56 61 6c 69 64 20 3d 20 72 65 73  cnoIsValid = res
6b70: 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ==0;.    if( res
6b80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
6b90: 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e  te3BtreeNext(p->
6ba0: 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
6bb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6bc0: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
6bd0: 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
6be0: 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 7d 0a  Moveto = 0;.  }.
6bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c00: 4f 4b 3b 0a 7d 0a 0a 0a 0a                       OK;.}....