/ Hex Artifact Content
Login

Artifact 8d8cc8992cb78cab35e034fa81ad0c1a771c39f1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tream..*/.#ifnde
03c0: 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
03d0: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
03e0: 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  trace = 0;.#endi
03f0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  f.../*.** Create
0400: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64   a new virtual d
0410: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a  atabase engine..
0420: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
0430: 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69 74  VdbeCreate(sqlit
0440: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
0450: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
0460: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 56  Malloc( sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74  .}../*.** Turn t
0540: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
0550: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0560: 56 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a  VdbeTrace(Vdbe *
0570: 70 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b  p, FILE *trace){
0580: 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72  .  p->trace = tr
0590: 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ace;.}../*.** Re
05a0: 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f  size the Vdbe.aO
05b0: 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  p array so that 
05c0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  it contains at l
05d0: 65 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d 65 6e  east N.** elemen
05e0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
05f0: 69 64 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  id resizeOpArray
0600: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29  (Vdbe *p, int N)
0610: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c  {.  if( p->nOpAl
0620: 6c 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 69 6e 74  loc<N ){.    int
0630: 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f   oldSize = p->nO
0640: 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e  pAlloc;.    p->n
0650: 4f 70 41 6c 6c 6f 63 20 3d 20 4e 2b 31 30 30 3b  OpAlloc = N+100;
0660: 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 73 71  .    p->aOp = sq
0670: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61  liteRealloc(p->a
0680: 4f 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  Op, p->nOpAlloc*
0690: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
06a0: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
06b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e       memset(&p->
06c0: 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c  aOp[oldSize], 0,
06d0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c   (p->nOpAlloc-ol
06e0: 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70  dSize)*sizeof(Op
06f0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
0700: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
0710: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
0720: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74  the list of inst
0730: 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74  ructions current
0740: 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e   in the.** VDBE.
0750: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64    Return the add
0760: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ress of the new 
0770: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
0780: 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a  ** Parameters:.*
0790: 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20  *.**    p       
07a0: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20          Pointer 
07b0: 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a  to the VDBE.**.*
07c0: 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20  *    op         
07d0: 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20       The opcode 
07e0: 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63  for this instruc
07f0: 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31  tion.**.**    p1
0800: 2c 20 70 32 20 20 20 20 20 20 20 20 20 20 46 69  , p2          Fi
0810: 72 73 74 20 74 77 6f 20 6f 66 20 74 68 65 20 74  rst two of the t
0820: 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 6f 70  hree possible op
0830: 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 55 73  erands..**.** Us
0840: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
0850: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20  eResolveLabel() 
0860: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20  function to fix 
0870: 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a  an address and.*
0880: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
0890: 65 43 68 61 6e 67 65 50 33 28 29 20 66 75 6e 63  eChangeP3() func
08a0: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
08b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
08c0: 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P3.** operand..*
08d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
08e0: 65 41 64 64 4f 70 28 56 64 62 65 20 2a 70 2c 20  eAddOp(Vdbe *p, 
08f0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
0900: 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e 74 20 69  int p2){.  int i
0910: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
0920: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
0930: 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 61 73    p->nOp++;.  as
0940: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
0950: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
0960: 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70 41 72 72  );.  resizeOpArr
0970: 61 79 28 70 2c 20 69 2b 31 29 3b 0a 20 20 69 66  ay(p, i+1);.  if
0980: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 7b 0a 20  ( p->aOp==0 ){. 
0990: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
09a0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
09b0: 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  [i];.  pOp->opco
09c0: 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e  de = op;.  pOp->
09d0: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
09e0: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
09f0: 70 33 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p3 = 0;.  pOp->p
0a00: 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53  3type = P3_NOTUS
0a10: 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ED;.#ifdef SQLIT
0a20: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 73 71  E_DEBUG.  if( sq
0a30: 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70  lite3_vdbe_addop
0a40: 5f 74 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  _trace ) sqlite3
0a50: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
0a60: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
0a70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
0a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
0a90: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
0aa0: 63 6c 75 64 65 73 20 74 68 65 20 70 33 20 76 61  cludes the p3 va
0ab0: 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lue..*/.int sqli
0ac0: 74 65 33 56 64 62 65 4f 70 33 28 56 64 62 65 20  te3VdbeOp3(Vdbe 
0ad0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0ae0: 70 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73  p1, int p2, cons
0af0: 74 20 63 68 61 72 20 2a 7a 50 33 2c 69 6e 74 20  t char *zP3,int 
0b00: 70 33 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61  p3type){.  int a
0b10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
0b20: 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31  eAddOp(p, op, p1
0b30: 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p2);.  sqlite3
0b40: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20  VdbeChangeP3(p, 
0b50: 61 64 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70  addr, zP3, p3typ
0b60: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
0b70: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
0b80: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
0b90: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
0ba0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
0bb0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
0bc0: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
0bd0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
0be0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
0bf0: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
0c00: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
0c10: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
0c20: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
0c30: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
0c40: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
0c50: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
0c60: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
0c70: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
0c80: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
0c90: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
0ca0: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
0cb0: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
0cc0: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
0cd0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
0ce0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
0cf0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
0d00: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
0d10: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
0d20: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
0d30: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
0d40: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
0d50: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
0d60: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
0d70: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
0d80: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
0d90: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
0da0: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
0db0: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
0dc0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
0dd0: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
0de0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
0df0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
0e00: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
0e10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  ){.  int i;.  i 
0e20: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
0e30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0e40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0e50: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
0e60: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b  ->nLabelAlloc ){
0e70: 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c  .    p->nLabelAl
0e80: 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41  loc = p->nLabelA
0e90: 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20  lloc*2 + 10;.   
0ea0: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
0eb0: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
0ec0: 4c 61 62 65 6c 2c 20 70 2d 3e 6e 4c 61 62 65 6c  Label, p->nLabel
0ed0: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d 3e  Alloc*sizeof(p->
0ee0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d  aLabel[0]));.  }
0ef0: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
0f00: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
0f10: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
0f20: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
0f30: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
0f40: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
0f50: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
0f60: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
0f70: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
0f80: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
0f90: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
0fa0: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
0fb0: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
0fc0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
0fd0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
0fe0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0ff0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1000: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
1010: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
1020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1030: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1040: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1050: 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e  t( j>=0 && j<p->
1060: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20  nLabel );.  if( 
1070: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1080: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
1090: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->nOp;.  }.}../
10a0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
10b0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
10c0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
10d0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
10e0: 61 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73  ative..** Each s
10f0: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1100: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1110: 68 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  he label by sett
1120: 69 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61  ing the P2.** va
1130: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
1140: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
1150: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1160: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1170: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
1180: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
1190: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74   inserted..*/.st
11a0: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
11b0: 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a  eP2Values(Vdbe *
11c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4f  p){.  int i;.  O
11d0: 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61  p *pOp;.  int *a
11e0: 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65  Label = p->aLabe
11f0: 6c 3b 0a 20 20 69 66 28 20 61 4c 61 62 65 6c 3d  l;.  if( aLabel=
1200: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1210: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
1220: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
1230: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
1240: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d 30    if( pOp->p2>=0
1250: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1260: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
1270: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
1280: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61  .    pOp->p2 = a
1290: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
12a0: 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  ];.  }.  sqliteF
12b0: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
12c0: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
12d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12e0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
12f0: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
1300: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
1310: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1320: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1330: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
1340: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1350: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1360: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
1370: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  nOp;.}../*.** Ad
1380: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
1390: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
13a0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
13b0: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ack.  Return the
13c0: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
13d0: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
13e0: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74  on added..*/.int
13f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1400: 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69  pList(Vdbe *p, i
1410: 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69  nt nOp, VdbeOpLi
1420: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a  st const *aOp){.
1430: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73    int addr;.  as
1440: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1450: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1460: 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70 41 72 72  );.  resizeOpArr
1470: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e  ay(p, p->nOp + n
1480: 4f 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  Op);.  if( p->aO
1490: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
14a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72  rn 0;.  }.  addr
14b0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
14c0: 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e   nOp>0 ){.    in
14d0: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c  t i;.    VdbeOpL
14e0: 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d  ist const *pIn =
14f0: 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d   aOp;.    for(i=
1500: 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70  0; i<nOp; i++, p
1510: 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  In++){.      int
1520: 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20   p2 = pIn->p2;. 
1530: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75       VdbeOp *pOu
1540: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  t = &p->aOp[i+ad
1550: 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  dr];.      pOut-
1560: 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f  >opcode = pIn->o
1570: 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75  pcode;.      pOu
1580: 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b  t->p1 = pIn->p1;
1590: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20  .      pOut->p2 
15a0: 3d 20 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20  = p2<0 ? addr + 
15b0: 41 44 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20  ADDR(p2) : p2;. 
15c0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
15d0: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
15e0: 4f 75 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49  Out->p3type = pI
15f0: 6e 2d 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49  n->p3 ? P3_STATI
1600: 43 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a  C : P3_NOTUSED;.
1610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1620: 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 73 71  BUG.      if( sq
1630: 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70  lite3_vdbe_addop
1640: 5f 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  _trace ){.      
1650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
1660: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
1670: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
1680: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1690: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
16a0: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
16b0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
16c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
16e0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
16f0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
1700: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1710: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
1720: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
1730: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
1740: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
1750: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
1760: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
1770: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
1780: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
1790: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
17a0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  e program..*/.vo
17b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
17c0: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
17d0: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
17e0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  l){.  assert( p-
17f0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1800: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
1810: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
1820: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
1830: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
1840: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
1850: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
1860: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
1870: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
1880: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
1890: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
18a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18b0: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
18c0: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
18d0: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
18e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
18f0: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
1900: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
1910: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 76 61  l){.  assert( va
1920: 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l>=0 );.  assert
1930: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1940: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1950: 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d   if( p && addr>=
1960: 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72  0 && p->nOp>addr
1970: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
1980: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
1990: 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  2 = val;.  }.}..
19a0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19b0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33   value of the P3
19c0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
19d0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
19e0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
19f0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
1a00: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
1a10: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
1a20: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
1a30: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
1a40: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
1a50: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
1a60: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
1a70: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
1a80: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
1a90: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
1aa0: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20  e P3 operand is 
1ab0: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
1ac0: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
1ad0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
1ae0: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
1af0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1b00: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a  sqliteMalloc()..
1b10: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
1b20: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
1b30: 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f  tes of zP3 up to
1b40: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
1b50: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
1b60: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
1b70: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
1b80: 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a  es of zP3..**.**
1b90: 20 49 66 20 6e 3d 3d 50 33 5f 53 54 41 54 49 43   If n==P3_STATIC
1ba0: 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20    it means that 
1bb0: 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72  zP3 is a pointer
1bc0: 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73   to a constant s
1bd0: 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20  tatic.** string 
1be0: 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20  and we can just 
1bf0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
1c00: 2e 20 20 6e 3d 3d 50 33 5f 50 4f 49 4e 54 45 52  .  n==P3_POINTER
1c10: 20 6d 65 61 6e 73 20 7a 50 33 20 69 73 0a 2a 2a   means zP3 is.**
1c20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f   a pointer to so
1c30: 6d 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  me object other 
1c40: 74 68 61 6e 20 61 20 73 74 72 69 6e 67 2e 20 20  than a string.  
1c50: 6e 3d 3d 50 33 5f 43 4f 4c 4c 53 45 51 20 61 6e  n==P3_COLLSEQ an
1c60: 64 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e  d.** n==P3_KEYIN
1c70: 46 4f 20 6d 65 61 6e 20 74 68 61 74 20 7a 50 33  FO mean that zP3
1c80: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1c90: 20 61 20 43 6f 6c 6c 53 65 71 20 6f 72 20 4b 65   a CollSeq or Ke
1ca0: 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  yInfo.** structu
1cb0: 72 65 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  re.  A copy is m
1cc0: 61 64 65 20 6f 66 20 4b 65 79 49 6e 66 6f 20 73  ade of KeyInfo s
1cd0: 74 72 75 63 74 75 72 65 73 20 69 6e 74 6f 20 6d  tructures into m
1ce0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a  emory obtained.*
1cf0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
1d00: 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  loc..**.** If ad
1d10: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
1d20: 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P3 on the most 
1d30: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
1d40: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
1d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1d60: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
1d70: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
1d80: 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69  nst char *zP3, i
1d90: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
1da0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1db0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1dc0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
1dd0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  ==0 || p->aOp==0
1de0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1df0: 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e   addr<0 || addr>
1e00: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61  =p->nOp ){.    a
1e10: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
1e20: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30  ;.    if( addr<0
1e30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
1e40: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
1e50: 64 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  ddr];.  if( pOp-
1e60: 3e 70 33 20 26 26 20 70 4f 70 2d 3e 70 33 74 79  >p3 && pOp->p3ty
1e70: 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29  pe==P3_DYNAMIC )
1e80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1e90: 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70  (pOp->p3);.    p
1ea0: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 7d 0a  Op->p3 = 0;.  }.
1eb0: 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a    if( zP3==0 ){.
1ec0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
1ed0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
1ee0: 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P3_NOTUSED;. 
1ef0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
1f00: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
1f10: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1f20: 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  o;.    int nFiel
1f30: 64 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 6e 46  d, nByte;.    nF
1f40: 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f  ield = ((KeyInfo
1f50: 2a 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a  *)zP3)->nField;.
1f60: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
1f70: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20  of(*pKeyInfo) + 
1f80: 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f  (nField-1)*sizeo
1f90: 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  f(pKeyInfo->aCol
1fa0: 6c 5b 30 5d 29 3b 0a 20 20 20 20 70 4b 65 79 49  l[0]);.    pKeyI
1fb0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
1fc0: 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a  ocRaw( nByte );.
1fd0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
1fe0: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 3b 0a 20  har*)pKeyInfo;. 
1ff0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
2000: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2010: 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e  pKeyInfo, zP3, n
2020: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 4f 70  Byte);.      pOp
2030: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45  ->p3type = P3_KE
2040: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
2050: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  {.      pOp->p3t
2060: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
2070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2080: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
2090: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
20a0: 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72   pOp->p3 = (char
20b0: 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP3;.    pOp->
20c0: 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49  p3type = P3_KEYI
20d0: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
20e0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
20f0: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
2100: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
2110: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
2120: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
2130: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 3b 0a   = strlen(zP3);.
2140: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71      pOp->p3 = sq
2150: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 50 33 2c  liteStrNDup(zP3,
2160: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33   n);.    pOp->p3
2170: 74 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49  type = P3_DYNAMI
2180: 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  C;.  }.}..#ifnde
2190: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
21a0: 65 70 6c 61 63 65 20 74 68 65 20 50 33 20 66 69  eplace the P3 fi
21b0: 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
21c0: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
21d0: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 0a  nstruction with.
21e0: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e  ** comment text.
21f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2200: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
2210: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2220: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2230: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2240: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
2250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2260: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
2270: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d 3d  p[p->nOp-1].p3==
2280: 30 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  0 );.  va_start(
2290: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
22a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22b0: 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69 74  eP3(p, -1, sqlit
22c0: 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d  e3VMPrintf(zForm
22d0: 61 74 2c 20 61 70 29 2c 20 50 33 5f 44 59 4e 41  at, ap), P3_DYNA
22e0: 4d 49 43 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61  MIC);.  va_end(a
22f0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
2300: 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 6f 70  .** If the P3 op
2310: 65 72 61 6e 64 20 74 6f 20 74 68 65 20 73 70 65  erand to the spe
2320: 63 69 66 69 65 64 20 69 6e 73 74 72 75 63 74 69  cified instructi
2330: 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 74 6f  on appears.** to
2340: 20 62 65 20 61 20 71 75 6f 74 65 64 20 73 74 72   be a quoted str
2350: 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 6e 20  ing token, then 
2360: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  this procedure r
2370: 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 20 71  emoves .** the q
2380: 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uotes..**.** The
2390: 20 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 74 6f   quoting operato
23a0: 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  r can be either 
23b0: 61 20 67 72 61 76 65 20 61 73 63 65 6e 74 20 28  a grave ascent (
23c0: 41 53 43 49 49 20 30 78 32 37 29 0a 2a 2a 20 6f  ASCII 0x27).** o
23d0: 72 20 61 20 64 6f 75 62 6c 65 20 71 75 6f 74 65  r a double quote
23e0: 20 63 68 61 72 61 63 74 65 72 20 28 41 53 43 49   character (ASCI
23f0: 49 20 30 78 32 32 29 2e 20 20 54 77 6f 20 71 75  I 0x22).  Two qu
2400: 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 0a 2a 2a  otes in a row.**
2410: 20 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 20 61   resolve to be a
2420: 20 73 69 6e 67 6c 65 20 61 63 74 75 61 6c 20 71   single actual q
2430: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77  uote character w
2440: 69 74 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67  ithin the string
2450: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2460: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 56  3VdbeDequoteP3(V
2470: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2480: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
2490: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
24a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
24b0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
24c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
24d0: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
24e0: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
24f0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
2500: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
2510: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
2520: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
2530: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20  Op[addr];.  if( 
2540: 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f  pOp->p3==0 || pO
2550: 70 2d 3e 70 33 5b 30 5d 3d 3d 30 20 29 20 72 65  p->p3[0]==0 ) re
2560: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70 2d  turn;.  if( pOp-
2570: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 53 54 41 54  >p3type==P3_STAT
2580: 49 43 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  IC ){.    pOp->p
2590: 33 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  3 = sqliteStrDup
25a0: 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70  (pOp->p3);.    p
25b0: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
25c0: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 20 20 61  DYNAMIC;.  }.  a
25d0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 74 79  ssert( pOp->p3ty
25e0: 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29  pe==P3_DYNAMIC )
25f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
2600: 74 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 7d 0a 0a  te(pOp->p3);.}..
2610: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
2620: 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d   current program
2630: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 6e 73   starting at ins
2640: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 66 6f  truction addr fo
2650: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 6f  r the given.** o
2660: 70 63 6f 64 65 20 61 6e 64 20 50 32 20 76 61 6c  pcode and P2 val
2670: 75 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ue.  Return the 
2680: 61 64 64 72 65 73 73 20 70 6c 75 73 20 31 20 69  address plus 1 i
2690: 66 20 66 6f 75 6e 64 20 61 6e 64 20 30 20 69 66  f found and 0 if
26a0: 20 6e 6f 74 0a 2a 2a 20 66 6f 75 6e 64 2e 0a 2a   not.** found..*
26b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
26c0: 65 46 69 6e 64 4f 70 28 56 64 62 65 20 2a 70 2c  eFindOp(Vdbe *p,
26d0: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 6f   int addr, int o
26e0: 70 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  p, int p2){.  in
26f0: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
2700: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2710: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 66 6f  GIC_INIT );.  fo
2720: 72 28 69 3d 61 64 64 72 3b 20 69 3c 70 2d 3e 6e  r(i=addr; i<p->n
2730: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Op; i++){.    if
2740: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  ( p->aOp[i].opco
2750: 64 65 3d 3d 6f 70 20 26 26 20 70 2d 3e 61 4f 70  de==op && p->aOp
2760: 5b 69 5d 2e 70 32 3d 3d 70 32 20 29 20 72 65 74  [i].p2==p2 ) ret
2770: 75 72 6e 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 72  urn i+1;.  }.  r
2780: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2790: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
27a0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
27b0: 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65  address..*/.Vdbe
27c0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
27d0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
27e0: 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72  t addr){.  asser
27f0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2800: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2810: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
2820: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
2830: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 26 70 2d   );.  return &p-
2840: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a 23  >aOp[addr];.}..#
2850: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2860: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
2870: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45   || !defined(NDE
2880: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64  BUG) \.     || d
2890: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
28a0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
28b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
28c0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
28d0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
28e0: 62 65 73 20 74 68 65 20 50 33 20 70 61 72 61 6d  bes the P3 param
28f0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
2900: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
2910: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
2920: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
2930: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
2940: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
2950: 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP3(Op *pOp, cha
2960: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
2970: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
2980: 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  3;.  assert( nTe
2990: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
29a0: 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 20  ch( pOp->p3type 
29b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33 5f 50  ){.    case P3_P
29c0: 4f 49 4e 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  OINTER: {.      
29d0: 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22  sprintf(zTemp, "
29e0: 70 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29  ptr(%#x)", (int)
29f0: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  pOp->p3);.      
2a00: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a20: 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49      case P3_KEYI
2a30: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
2a40: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
2a50: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2a60: 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e   (KeyInfo*)pOp->
2a70: 70 33 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  p3;.      sprint
2a80: 66 28 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66  f(zTemp, "keyinf
2a90: 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  o(%d", pKeyInfo-
2aa0: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
2ab0: 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70  i = strlen(zTemp
2ac0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
2ad0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
2ae0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
2af0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
2b00: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
2b10: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
2b20: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
2b30: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
2b40: 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e  strlen(pColl->zN
2b50: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2b60: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
2b70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b80: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  trcpy(&zTemp[i],
2b90: 22 2c 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20 20  ",...");.       
2ba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bc0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
2bd0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ,';.          if
2be0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
2bf0: 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e  tOrder && pKeyIn
2c00: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
2c10: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
2c20: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
2c30: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
2c40: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
2c50: 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c  &zTemp[i], pColl
2c60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2c70: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
2c80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
2c90: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
2ca0: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
2cb0: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29 3b  Temp[i],",nil");
2cc0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
2cd0: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
2ce0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
2cf0: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
2d00: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
2d10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2d20: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
2d30: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
2d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2d50: 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c      case P3_COLL
2d60: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
2d70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
2d80: 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b  ollSeq*)pOp->p3;
2d90: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
2da0: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
2db0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
2dc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50 33  Name);.      zP3
2dd0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
2de0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2df0: 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46   case P3_FUNCDEF
2e00: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
2e10: 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44  f *pDef = (FuncD
2e20: 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  ef*)pOp->p3;.   
2e30: 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d     char zNum[30]
2e40: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
2e50: 7a 54 65 6d 70 2c 20 22 25 2e 2a 73 22 2c 20 6e  zTemp, "%.*s", n
2e60: 54 65 6d 70 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  Temp, pDef->zNam
2e70: 65 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  e);.      sprint
2e80: 66 28 7a 4e 75 6d 2c 22 28 25 64 29 22 2c 20 70  f(zNum,"(%d)", p
2e90: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
2ea0: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 54 65    if( strlen(zTe
2eb0: 6d 70 29 2b 73 74 72 6c 65 6e 28 7a 4e 75 6d 29  mp)+strlen(zNum)
2ec0: 2b 31 3c 3d 6e 54 65 6d 70 20 29 7b 0a 20 20 20  +1<=nTemp ){.   
2ed0: 20 20 20 20 20 73 74 72 63 61 74 28 7a 54 65 6d       strcat(zTem
2ee0: 70 2c 20 7a 4e 75 6d 29 3b 0a 20 20 20 20 20 20  p, zNum);.      
2ef0: 7d 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  }.      zP3 = zT
2f00: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
2f10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
2f20: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33  ult: {.      zP3
2f30: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
2f40: 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20    if( zP3==0 || 
2f50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2f60: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
2f70: 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  zP3 = "";.      
2f80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2f90: 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64  turn zP3;.}.#end
2fa0: 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  if...#if defined
2fb0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
2fc0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
2fd0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
2fe0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
2ff0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
3000: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
3010: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
3020: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3030: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
3040: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
3050: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
3060: 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP3;.  char zPtr
3070: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
3080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3090: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
30a0: 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22 3b 0a   %4d %4d %s\n";.
30b0: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
30c0: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
30d0: 20 7a 50 33 20 3d 20 64 69 73 70 6c 61 79 50 33   zP3 = displayP3
30e0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
30f0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
3100: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
3110: 61 74 31 2c 0a 20 20 20 20 20 20 70 63 2c 20 73  at1,.      pc, s
3120: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
3130: 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20  s[pOp->opcode], 
3140: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
3150: 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c 75 73 68  , zP3);.  fflush
3160: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
3170: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
3180: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
3190: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
31a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
31b0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
31c0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
31d0: 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  p ){.    while( 
31e0: 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  N-->0 ){.      s
31f0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
3200: 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d  ease(p++);.    }
3210: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
3220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
3230: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
3240: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
3250: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
3260: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
3270: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
3280: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
3290: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
32a0: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
32b0: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
32c0: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
32d0: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
32e0: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
32f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
3300: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
3310: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
3320: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f  nt "EXPLAIN"..*/
3330: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3340: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
3370: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3380: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
3390: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
33a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
33b0: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
33c0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
33d0: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
33e0: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
33f0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65  E_MISUSE;.  asse
3400: 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53  rt( db->magic==S
3410: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
3440: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
3450: 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  BUSY );..  /* Ev
3460: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
3470: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70  pcode does not p
3480: 75 74 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  ut dynamic strin
3490: 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  gs onto the.  **
34a0: 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79   the stack, they
34b0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
34c0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
34d0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
34e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
34f0: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
3500: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
3510: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
3520: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f 73  */.  if( p->pTos
3530: 3d 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20  ==&p->aStack[4] 
3540: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
3550: 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b  mArray(p->aStack
3560: 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72  , 5);.  }.  p->r
3570: 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a  esOnStack = 0;..
3580: 0a 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a  .  i = p->pc++;.
3590: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20    if( i>=p->nOp 
35a0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
35b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
35c0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
35d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
35e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
35f0: 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20  nterrupt ){.    
3600: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
3610: 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a  LITE_Interrupt;.
3620: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
3630: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
3640: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3650: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
3660: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
3670: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 45 72  rrMsg, sqlite3Er
3680: 72 53 74 72 28 70 2d 3e 72 63 29 2c 20 28 63 68  rStr(p->rc), (ch
3690: 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ar*)0);.  }else{
36a0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26  .    Op *pOp = &
36b0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d  p->aOp[i];.    M
36c0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 53  em *pMem = p->aS
36d0: 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  tack;.    pMem->
36e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
36f0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
3700: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
3710: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20  ;.    pMem->i = 
3720: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
3750: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  nter */.    pMem
3760: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
3770: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
3780: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
3790: 72 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  rm;.    pMem->z 
37a0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
37b0: 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  ames[pOp->opcode
37c0: 5d 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  ];  /* Opcode */
37d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73  .    pMem->n = s
37e0: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
37f0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
3800: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
3810: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
3820: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70  LITE_UTF8;.    p
3830: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
3840: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
3850: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  t;.    pMem->i =
3860: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
3890: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
38a0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
38b0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
38c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
38d0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69  Int;.    pMem->i
38e0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
3910: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
3920: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
3930: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
3940: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
3950: 4d 5f 53 68 6f 72 74 7c 4d 45 4d 5f 53 74 72 7c  M_Short|MEM_Str|
3960: 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20 50  MEM_Term;   /* P
3970: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  3 */.    pMem->z
3980: 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70   = displayP3(pOp
3990: 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20  , pMem->zShort, 
39a0: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68  sizeof(pMem->zSh
39b0: 6f 72 74 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  ort));.    pMem-
39c0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
39d0: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  EXT;.    pMem->e
39e0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
39f0: 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  ;..    p->nResCo
3a00: 6c 75 6d 6e 20 3d 20 35 3b 0a 20 20 20 20 70 2d  lumn = 5;.    p-
3a10: 3e 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20  >pTos = pMem;.  
3a20: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
3a30: 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f  _OK;.    p->resO
3a40: 6e 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  nStack = 1;.    
3a50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
3a60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3a70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3a80: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
3a90: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  N */../*.** Prin
3aa0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
3ab0: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
3ac0: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
3ad0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
3ae0: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
3af0: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  Vdbe *p){.#ifdef
3b00: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
3b10: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
3b20: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
3b30: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
3b40: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
3b50: 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20  p->aOp[nOp-1];. 
3b60: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
3b70: 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70  ==OP_Noop && pOp
3b80: 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 63  ->p3!=0 ){.    c
3b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
3ba0: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c  Op->p3;.    whil
3bb0: 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a  e( isspace(*(u8*
3bc0: 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70  )z) ) z++;.    p
3bd0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
3be0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 23 65 6e  \n", z);.  }.#en
3bf0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
3c00: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
3c10: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
3c20: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f  tion.  This invo
3c30: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
3c40: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
3c50: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
3c60: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
3c70: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
3c80: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
3c90: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
3ca0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
3cb0: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
3cc0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
3cd0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
3ce0: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
3cf0: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
3d00: 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44  way to move a VD
3d10: 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  BE from VDBE_MAG
3d20: 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44  IC_INIT to.** VD
3d30: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f  BE_MAGIC_RUN..*/
3d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3d50: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
3d60: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d80: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  The VDBE */.  in
3d90: 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20  t nVar,         
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3db0: 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65  Number of '?' se
3dc0: 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61  e in the SQL sta
3dd0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
3de0: 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20  nMem,           
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3e00: 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63  mber of memory c
3e10: 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ells to allocate
3e20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
3e30: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
3e40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3e50: 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  f cursors to all
3e60: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
3e70: 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Agg,            
3e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3e90: 62 65 72 20 6f 66 20 61 67 67 72 65 67 61 74 65  ber of aggregate
3ea0: 20 63 6f 6e 74 65 78 74 73 20 72 65 71 75 69 72   contexts requir
3eb0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78  ed */.  int isEx
3ec0: 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20  plain           
3ed0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3ee0: 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  f the EXPLAIN ke
3ef0: 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e  ywords is presen
3f00: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  t */.){.  int n;
3f10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
3f20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3f30: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3f40: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
3f50: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
3f60: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
3f70: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
3f80: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
3f90: 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75  ..  /* No instru
3fa0: 63 74 69 6f 6e 20 65 76 65 72 20 70 75 73 68 65  ction ever pushe
3fb0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 73 69  s more than a si
3fc0: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74  ngle element ont
3fd0: 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b  o the.  ** stack
3fe0: 2e 20 20 41 6e 64 20 74 68 65 20 73 74 61 63 6b  .  And the stack
3ff0: 20 6e 65 76 65 72 20 67 72 6f 77 73 20 6f 6e 20   never grows on 
4000: 73 75 63 63 65 73 73 69 76 65 20 65 78 65 63 75  successive execu
4010: 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a  tions of the.  *
4020: 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f  * same loop.  So
4030: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
4040: 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  r of instruction
4050: 73 20 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f  s is an upper bo
4060: 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  und.  ** on the 
4070: 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65  maximum stack de
4080: 70 74 68 20 72 65 71 75 69 72 65 64 2e 0a 20 20  pth required..  
4090: 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69  **.  ** Allocati
40a0: 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b  on all the stack
40b0: 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65   space we will e
40c0: 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20  ver need..  */. 
40d0: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d   if( p->aStack==
40e0: 30 20 29 7b 0a 20 20 20 20 72 65 73 6f 6c 76 65  0 ){.    resolve
40f0: 50 32 56 61 6c 75 65 73 28 70 29 3b 0a 20 20 20  P2Values(p);.   
4100: 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30   assert( nVar>=0
4110: 20 29 3b 0a 20 20 20 20 6e 20 3d 20 69 73 45 78   );.    n = isEx
4120: 70 6c 61 69 6e 20 3f 20 31 30 20 3a 20 70 2d 3e  plain ? 10 : p->
4130: 6e 4f 70 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61  nOp;.    p->aSta
4140: 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ck = sqliteMallo
4150: 63 28 0a 20 20 20 20 20 20 20 20 6e 2a 73 69 7a  c(.        n*siz
4160: 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d  eof(p->aStack[0]
4170: 29 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 74  )         /* aSt
4180: 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  ack */.      + n
4190: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20  *sizeof(Mem*)   
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41b0: 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20   apArg */.      
41c0: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  + nVar*sizeof(Me
41d0: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
41e0: 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20   /* aVar */.    
41f0: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
4200: 63 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20  char*)          
4210: 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20     /* azVar */. 
4220: 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65       + nMem*size
4230: 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20  of(Mem)         
4240: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f        /* aMem */
4250: 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72  .      + nCursor
4260: 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29  *sizeof(Cursor*)
4270: 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 73 72          /* apCsr
4280: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 67 67   */.      + nAgg
4290: 2a 73 69 7a 65 6f 66 28 41 67 67 29 20 20 20 20  *sizeof(Agg)    
42a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 67             /* Ag
42b0: 67 72 65 67 61 74 65 20 63 6f 6e 74 65 78 74 73  gregate contexts
42c0: 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   */.    );.    i
42d0: 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f( !sqlite3_mall
42e0: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
42f0: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d     p->aMem = &p-
4300: 3e 61 53 74 61 63 6b 5b 6e 5d 3b 0a 20 20 20 20  >aStack[n];.    
4310: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
4320: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20  ;.      p->aVar 
4330: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d  = &p->aMem[nMem]
4340: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20  ;.      p->nVar 
4350: 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d  = nVar;.      p-
4360: 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20  >okVar = 0;.    
4370: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65    p->apArg = (Me
4380: 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61  m**)&p->aVar[nVa
4390: 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56  r];.      p->azV
43a0: 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d  ar = (char**)&p-
43b0: 3e 61 70 41 72 67 5b 6e 5d 3b 0a 20 20 20 20 20  >apArg[n];.     
43c0: 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75 72   p->apCsr = (Cur
43d0: 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b  sor**)&p->azVar[
43e0: 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 69 66 28  nVar];.      if(
43f0: 20 6e 41 67 67 3e 30 20 29 7b 0a 20 20 20 20 20   nAgg>0 ){.     
4400: 20 20 20 70 2d 3e 6e 41 67 67 20 3d 20 6e 41 67     p->nAgg = nAg
4410: 67 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  g;.        p->ap
4420: 41 67 67 20 3d 20 28 41 67 67 2a 29 26 70 2d 3e  Agg = (Agg*)&p->
4430: 61 70 43 73 72 5b 6e 43 75 72 73 6f 72 5d 3b 0a  apCsr[nCursor];.
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
4450: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
4460: 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  or;.      for(n=
4470: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
4480: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
4490: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
44a0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Null;.      }.  
44b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 70 41 67    }.  }.  p->pAg
44c0: 67 20 3d 20 70 2d 3e 61 70 41 67 67 3b 0a 20 20  g = p->apAgg;.  
44d0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d  for(n=0; n<p->nM
44e0: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d  em; n++){.    p-
44f0: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
4500: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a   MEM_Null;.  }..
4510: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4520: 42 55 47 0a 20 20 69 66 28 20 28 70 2d 3e 64 62  BUG.  if( (p->db
4530: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
4540: 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30  _VdbeListing)!=0
4550: 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4f  .    || sqlite3O
4560: 73 46 69 6c 65 45 78 69 73 74 73 28 22 76 64 62  sFileExists("vdb
4570: 65 5f 65 78 70 6c 61 69 6e 22 29 0a 20 20 29 7b  e_explain").  ){
4580: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4590: 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72 6f  printf("VDBE Pro
45a0: 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e 22  gram Listing:\n"
45b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
45c0: 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20  bePrintSql(p);. 
45d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
45e0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
45f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4600: 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c 20  ntOp(stdout, i, 
4610: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
4620: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
4630: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
4640: 28 22 76 64 62 65 5f 74 72 61 63 65 22 29 20 29  ("vdbe_trace") )
4650: 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 20 3d  {.    p->trace =
4660: 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e   stdout;.  }.#en
4670: 64 69 66 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20  dif.  p->pTos = 
4680: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
4690: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
46a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
46b0: 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e  K;.  p->uniqueCn
46c0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75  t = 0;.  p->retu
46d0: 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  rnDepth = 0;.  p
46e0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
46f0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70  OE_Abort;.  p->p
4700: 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20  opStack =  0;.  
4710: 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73  p->explain |= is
4720: 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61  Explain;.  p->ma
4730: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
4740: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
4750: 67 65 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  ge = 0;.#ifdef V
4760: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
4770: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
4780: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
4790: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
47a0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
47b0: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
47c0: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20  .cycles = 0;.   
47d0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
47e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
47f0: 6e 79 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74  ny elements that
4800: 20 72 65 6d 61 69 6e 20 6f 6e 20 74 68 65 20 73   remain on the s
4810: 6f 72 74 65 72 20 66 6f 72 20 74 68 65 20 56 44  orter for the VD
4820: 42 45 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  BE given..*/.voi
4830: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  d sqlite3VdbeSor
4840: 74 65 72 52 65 73 65 74 28 56 64 62 65 20 2a 70  terReset(Vdbe *p
4850: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
4860: 53 6f 72 74 20 29 7b 0a 20 20 20 20 53 6f 72 74  Sort ){.    Sort
4870: 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 2d  er *pSorter = p-
4880: 3e 70 53 6f 72 74 3b 0a 20 20 20 20 70 2d 3e 70  >pSort;.    p->p
4890: 53 6f 72 74 20 3d 20 70 53 6f 72 74 65 72 2d 3e  Sort = pSorter->
48a0: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
48b0: 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 7a  eFree(pSorter->z
48c0: 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
48d0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
48e0: 26 70 53 6f 72 74 65 72 2d 3e 64 61 74 61 29 3b  &pSorter->data);
48f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4900: 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  pSorter);.  }.}.
4910: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
4920: 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63 69  resources alloci
4930: 61 74 65 64 20 77 69 74 68 20 41 67 67 45 6c 65  ated with AggEle
4940: 6d 20 70 45 6c 65 6d 2c 20 61 6e 20 65 6c 65 6d  m pElem, an elem
4950: 65 6e 74 20 6f 66 0a 2a 2a 20 61 67 67 72 65 67  ent of.** aggreg
4960: 61 74 65 20 70 41 67 67 2e 0a 2a 2f 0a 73 74 61  ate pAgg..*/.sta
4970: 74 69 63 20 76 6f 69 64 20 66 72 65 65 41 67 67  tic void freeAgg
4980: 45 6c 65 6d 28 41 67 67 45 6c 65 6d 20 2a 70 45  Elem(AggElem *pE
4990: 6c 65 6d 2c 20 41 67 67 20 2a 70 41 67 67 29 7b  lem, Agg *pAgg){
49a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
49b0: 69 3d 30 3b 20 69 3c 70 41 67 67 2d 3e 6e 4d 65  i=0; i<pAgg->nMe
49c0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  m; i++){.    Mem
49d0: 20 2a 70 4d 65 6d 20 3d 20 26 70 45 6c 65 6d 2d   *pMem = &pElem-
49e0: 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 69 66  >aMem[i];.    if
49f0: 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 26  ( pAgg->apFunc &
4a00: 26 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69  & pAgg->apFunc[i
4a10: 5d 20 26 26 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ] && (pMem->flag
4a20: 73 20 26 20 4d 45 4d 5f 41 67 67 43 74 78 29 21  s & MEM_AggCtx)!
4a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4a40: 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b  te3_context ctx;
4a50: 0a 20 20 20 20 20 20 63 74 78 2e 70 46 75 6e 63  .      ctx.pFunc
4a60: 20 3d 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b   = pAgg->apFunc[
4a70: 69 5d 3b 0a 20 20 20 20 20 20 63 74 78 2e 73 2e  i];.      ctx.s.
4a80: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
4a90: 3b 0a 20 20 20 20 20 20 63 74 78 2e 70 41 67 67  ;.      ctx.pAgg
4aa0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
4ab0: 20 20 63 74 78 2e 63 6e 74 20 3d 20 70 4d 65 6d    ctx.cnt = pMem
4ac0: 2d 3e 69 3b 0a 20 20 20 20 20 20 63 74 78 2e 69  ->i;.      ctx.i
4ad0: 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  sError = 0;.    
4ae0: 20 20 28 2a 63 74 78 2e 70 46 75 6e 63 2d 3e 78    (*ctx.pFunc->x
4af0: 46 69 6e 61 6c 69 7a 65 29 28 26 63 74 78 29 3b  Finalize)(&ctx);
4b00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
4b10: 20 63 74 78 2e 70 41 67 67 3b 0a 20 20 20 20 20   ctx.pAgg;.     
4b20: 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20   if( pMem->z!=0 
4b30: 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d  && pMem->z!=pMem
4b40: 2d 3e 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20 20  ->zShort ){.    
4b50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4b60: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d  Mem->z);.      }
4b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4b80: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74  beMemRelease(&ct
4b90: 78 2e 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  x.s);.    }else{
4ba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4bb0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
4bc0: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
4bd0: 73 71 6c 69 74 65 46 72 65 65 28 70 45 6c 65 6d  sqliteFree(pElem
4be0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
4bf0: 74 20 61 6e 20 41 67 67 20 73 74 72 75 63 74 75  t an Agg structu
4c00: 72 65 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20  re.  Delete all 
4c10: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  its contents..**
4c20: 0a 2a 2a 20 46 6f 72 20 69 6e 73 74 61 6c 6c 61  .** For installa
4c30: 62 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  ble aggregate fu
4c40: 6e 63 74 69 6f 6e 73 2c 20 69 66 20 74 68 65 20  nctions, if the 
4c50: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 68 61  step function ha
4c60: 73 20 62 65 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64  s been.** called
4c70: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
4c80: 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69  finalizer functi
4c90: 6f 6e 20 68 61 73 20 61 6c 73 6f 20 62 65 65 6e  on has also been
4ca0: 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 0a 2a 2a   called.  The.**
4cb0: 20 66 69 6e 61 6c 69 7a 65 72 20 6d 69 67 68 74   finalizer might
4cc0: 20 6e 65 65 64 20 74 6f 20 66 72 65 65 20 6d 65   need to free me
4cd0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 61 6c  mory that was al
4ce0: 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72 74 20  located as part 
4cf0: 6f 66 20 69 74 73 0a 2a 2a 20 70 72 69 76 61 74  of its.** privat
4d00: 65 20 63 6f 6e 74 65 78 74 2e 20 20 49 66 20 74  e context.  If t
4d10: 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 68 61 73  he finalizer has
4d20: 20 6e 6f 74 20 62 65 65 6e 20 63 61 6c 6c 65 64   not been called
4d30: 20 79 65 74 2c 20 63 61 6c 6c 20 69 74 0a 2a 2a   yet, call it.**
4d40: 20 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64   now..**.** If d
4d50: 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  b is NULL, then 
4d60: 74 68 69 73 20 69 73 20 62 65 69 6e 67 20 63 61  this is being ca
4d70: 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  lled from sqlite
4d80: 56 64 62 65 52 65 73 65 74 28 29 2e 20 49 6e 0a  VdbeReset(). In.
4d90: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 63 6c 65  ** this case cle
4da0: 61 6e 20 75 70 20 61 6c 6c 20 72 65 66 65 72 65  an up all refere
4db0: 6e 63 65 73 20 74 6f 20 74 68 65 20 74 65 6d 70  nces to the temp
4dc0: 2d 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 0a  -table used for.
4dd0: 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20 28 69  ** aggregates (i
4de0: 66 20 69 74 20 77 61 73 20 65 76 65 72 20 6f 70  f it was ever op
4df0: 65 6e 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ened)..**.** If 
4e00: 64 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  db is not NULL, 
4e10: 74 68 65 6e 20 74 68 69 73 20 69 73 20 62 65 69  then this is bei
4e20: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
4e30: 69 74 68 20 61 6e 20 4f 50 5f 41 67 67 52 65 73  ith an OP_AggRes
4e40: 65 74 0a 2a 2a 20 6f 70 63 6f 64 65 2e 20 4f 70  et.** opcode. Op
4e50: 65 6e 20 74 68 65 20 74 65 6d 70 2d 74 61 62 6c  en the temp-tabl
4e60: 65 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  e, if it has not
4e70: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
4e80: 65 6e 65 64 20 61 6e 64 0a 2a 2a 20 64 65 6c 65  ened and.** dele
4e90: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
4ea0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 73 65  of the table use
4eb0: 64 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  d for aggregate 
4ec0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 72 65 61  information, rea
4ed0: 64 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  dy.** for the ne
4ee0: 78 74 20 72 6f 75 6e 64 20 6f 66 20 61 67 67 72  xt round of aggr
4ef0: 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
4f00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4f10: 56 64 62 65 41 67 67 52 65 73 65 74 28 73 71 6c  VdbeAggReset(sql
4f20: 69 74 65 33 20 2a 64 62 2c 20 41 67 67 20 2a 70  ite3 *db, Agg *p
4f30: 41 67 67 2c 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  Agg, KeyInfo *pK
4f40: 65 79 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 72  eyInfo){.  int r
4f50: 63 20 3d 20 30 3b 0a 20 20 42 74 43 75 72 73 6f  c = 0;.  BtCurso
4f60: 72 20 2a 70 43 73 72 3b 0a 0a 20 20 69 66 28 20  r *pCsr;..  if( 
4f70: 21 70 41 67 67 20 29 20 72 65 74 75 72 6e 20 53  !pAgg ) return S
4f80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 43 73 72  QLITE_OK;.  pCsr
4f90: 20 3d 20 70 41 67 67 2d 3e 70 43 73 72 3b 0a 20   = pAgg->pCsr;. 
4fa0: 20 61 73 73 65 72 74 28 20 28 70 43 73 72 20 26   assert( (pCsr &
4fb0: 26 20 70 41 67 67 2d 3e 6e 54 61 62 3e 30 29 20  & pAgg->nTab>0) 
4fc0: 7c 7c 20 28 21 70 43 73 72 20 26 26 20 70 41 67  || (!pCsr && pAg
4fd0: 67 2d 3e 6e 54 61 62 3d 3d 30 29 0a 20 20 20 20  g->nTab==0).    
4fe0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
4ff0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 3b  malloc_failed );
5000: 0a 0a 20 20 2f 2a 20 49 66 20 70 43 73 72 20 69  ..  /* If pCsr i
5010: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
5020: 20 74 68 65 20 74 61 62 6c 65 20 75 73 65 64 20   the table used 
5030: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 69 6e  for aggregate in
5040: 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 2a 2a 20 69  formation.  ** i
5050: 73 20 6f 70 65 6e 2e 20 4c 6f 6f 70 20 74 68 72  s open. Loop thr
5060: 6f 75 67 68 20 69 74 20 61 6e 64 20 66 72 65 65  ough it and free
5070: 20 74 68 65 20 41 67 67 45 6c 65 6d 2a 20 73 74   the AggElem* st
5080: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
5090: 61 74 0a 20 20 2a 2a 20 62 79 20 65 61 63 68 20  at.  ** by each 
50a0: 65 6e 74 72 79 2e 20 49 66 20 74 68 65 20 66 69  entry. If the fi
50b0: 6e 61 6c 69 7a 65 72 20 68 61 73 20 6e 6f 74 20  nalizer has not 
50c0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20  been called for 
50d0: 61 6e 20 41 67 67 45 6c 65 6d 2c 0a 20 20 2a 2a  an AggElem,.  **
50e0: 20 64 6f 20 74 68 61 74 20 74 6f 6f 2e 20 46 69   do that too. Fi
50f0: 6e 61 6c 6c 79 2c 20 63 6c 65 61 72 20 74 68 65  nally, clear the
5100: 20 62 74 72 65 65 20 74 61 62 6c 65 20 69 74 73   btree table its
5110: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  elf..  */.  if( 
5120: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
5130: 72 65 73 3b 0a 20 20 20 20 61 73 73 65 72 74 28  res;.    assert(
5140: 20 70 41 67 67 2d 3e 70 42 74 72 65 65 20 29 3b   pAgg->pBtree );
5150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
5160: 67 2d 3e 6e 54 61 62 3e 30 20 29 3b 0a 0a 20 20  g->nTab>0 );..  
5170: 20 20 72 63 3d 73 71 6c 69 74 65 33 42 74 72 65    rc=sqlite3Btre
5180: 65 46 69 72 73 74 28 70 43 73 72 2c 20 26 72 65  eFirst(pCsr, &re
5190: 73 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  s);.    while( r
51a0: 65 73 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  es==0 && rc==SQL
51b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
51c0: 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  AggElem *pElem;.
51d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
51e0: 65 33 42 74 72 65 65 44 61 74 61 28 70 43 73 72  e3BtreeData(pCsr
51f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41 67 67 45  , 0, sizeof(AggE
5200: 6c 65 6d 2a 29 2c 20 28 63 68 61 72 20 2a 29 26  lem*), (char *)&
5210: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  pElem);.      if
5220: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5230: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
5240: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
5250: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
5260: 2d 3e 61 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20  ->apFunc!=0 );. 
5270: 20 20 20 20 20 66 72 65 65 41 67 67 45 6c 65 6d       freeAggElem
5280: 28 70 45 6c 65 6d 2c 20 70 41 67 67 29 3b 0a 20  (pElem, pAgg);. 
5290: 20 20 20 20 20 72 63 3d 73 71 6c 69 74 65 33 42       rc=sqlite3B
52a0: 74 72 65 65 4e 65 78 74 28 70 43 73 72 2c 20 26  treeNext(pCsr, &
52b0: 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  res);.    }.    
52c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
52d0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
52e0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
52f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
5300: 73 65 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  seCursor(pCsr);.
5310: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
5320: 43 6c 65 61 72 54 61 62 6c 65 28 70 41 67 67 2d  ClearTable(pAgg-
5330: 3e 70 42 74 72 65 65 2c 20 70 41 67 67 2d 3e 6e  >pBtree, pAgg->n
5340: 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a  Tab);.  }else{ .
5350: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
5360: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
5370: 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 61 67  n because the ag
5380: 67 72 65 67 61 74 6f 72 20 77 61 73 20 6e 65 76  gregator was nev
5390: 65 72 20 75 73 65 64 2c 0a 20 20 20 20 2a 2a 20  er used,.    ** 
53a0: 6f 72 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  or it could be t
53b0: 68 61 74 20 69 74 20 77 61 73 20 75 73 65 64 20  hat it was used 
53c0: 62 75 74 20 74 68 65 72 65 20 77 61 73 20 6e 6f  but there was no
53d0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
53e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
53f0: 20 70 41 67 67 2d 3e 70 43 75 72 72 65 6e 74 20   pAgg->pCurrent 
5400: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 41 67 67  ){.      freeAgg
5410: 45 6c 65 6d 28 70 41 67 67 2d 3e 70 43 75 72 72  Elem(pAgg->pCurr
5420: 65 6e 74 2c 20 70 41 67 67 29 3b 0a 20 20 20 20  ent, pAgg);.    
5430: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 64  }.  }..  /* If d
5440: 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  b is not NULL an
5450: 64 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65  d we have not ye
5460: 74 20 61 6e 64 20 77 65 20 68 61 76 65 20 6e 6f  t and we have no
5470: 74 20 79 65 74 20 6f 70 65 6e 65 64 0a 20 20 2a  t yet opened.  *
5480: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
5490: 62 74 72 65 65 20 74 68 65 6e 20 64 6f 20 73 6f  btree then do so
54a0: 20 61 6e 64 20 63 72 65 61 74 65 20 74 68 65 20   and create the 
54b0: 74 61 62 6c 65 20 74 6f 20 73 74 6f 72 65 20 61  table to store a
54c0: 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 69 6e  ggregate.  ** in
54d0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  formation..  **.
54e0: 20 20 2a 2a 20 49 66 20 64 62 20 69 73 20 4e 55    ** If db is NU
54f0: 4c 4c 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  LL, then close t
5500: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 74 72  he temporary btr
5510: 65 65 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ee if it is open
5520: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 20  ..  */.  if( db 
5530: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 41 67 67  ){.    if( !pAgg
5540: 2d 3e 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ->pBtree ){.    
5550: 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
5560: 6e 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  nTab==0 );.#ifnd
5570: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
5580: 45 4d 4f 52 59 44 42 0a 20 20 20 20 20 20 72 63  EMORYDB.      rc
5590: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
55a0: 61 63 74 6f 72 79 28 64 62 2c 20 22 3a 6d 65 6d  actory(db, ":mem
55b0: 6f 72 79 3a 22 2c 20 30 2c 20 54 45 4d 50 5f 50  ory:", 0, TEMP_P
55c0: 41 47 45 53 2c 20 26 70 41 67 67 2d 3e 70 42 74  AGES, &pAgg->pBt
55d0: 72 65 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ree);.#else.    
55e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
55f0: 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
5600: 2c 20 30 2c 20 54 45 4d 50 5f 50 41 47 45 53 2c  , 0, TEMP_PAGES,
5610: 20 26 70 41 67 67 2d 3e 70 42 74 72 65 65 29 3b   &pAgg->pBtree);
5620: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
5630: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5640: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
5650: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 42     sqlite3BtreeB
5660: 65 67 69 6e 54 72 61 6e 73 28 70 41 67 67 2d 3e  eginTrans(pAgg->
5670: 70 42 74 72 65 65 2c 20 31 29 3b 0a 20 20 20 20  pBtree, 1);.    
5680: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5690: 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
56a0: 41 67 67 2d 3e 70 42 74 72 65 65 2c 20 26 70 41  Agg->pBtree, &pA
56b0: 67 67 2d 3e 6e 54 61 62 2c 20 30 29 3b 0a 20 20  gg->nTab, 0);.  
56c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
56d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
56e0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
56f0: 65 72 74 28 20 70 41 67 67 2d 3e 6e 54 61 62 21  ert( pAgg->nTab!
5700: 3d 30 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  =0 );..    rc = 
5710: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
5720: 6f 72 28 70 41 67 67 2d 3e 70 42 74 72 65 65 2c  or(pAgg->pBtree,
5730: 20 70 41 67 67 2d 3e 6e 54 61 62 2c 20 31 2c 0a   pAgg->nTab, 1,.
5740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5750: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
5760: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 26 70 41 67  , pKeyInfo, &pAg
5770: 67 2d 3e 70 43 73 72 29 3b 0a 20 20 20 20 69 66  g->pCsr);.    if
5780: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5790: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
57a0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 41  else{.    if( pA
57b0: 67 67 2d 3e 70 42 74 72 65 65 20 29 7b 0a 20 20  gg->pBtree ){.  
57c0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
57d0: 43 6c 6f 73 65 28 70 41 67 67 2d 3e 70 42 74 72  Close(pAgg->pBtr
57e0: 65 65 29 3b 0a 20 20 20 20 20 20 70 41 67 67 2d  ee);.      pAgg-
57f0: 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 20  >pBtree = 0;.   
5800: 20 20 20 70 41 67 67 2d 3e 6e 54 61 62 20 3d 20     pAgg->nTab = 
5810: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 67  0;.    }.    pAg
5820: 67 2d 3e 70 43 73 72 20 3d 20 30 3b 0a 20 20 7d  g->pCsr = 0;.  }
5830: 0a 0a 20 20 69 66 28 20 70 41 67 67 2d 3e 61 70  ..  if( pAgg->ap
5840: 46 75 6e 63 20 29 7b 20 0a 20 20 20 20 73 71 6c  Func ){ .    sql
5850: 69 74 65 46 72 65 65 28 70 41 67 67 2d 3e 61 70  iteFree(pAgg->ap
5860: 46 75 6e 63 29 3b 0a 20 20 20 20 70 41 67 67 2d  Func);.    pAgg-
5870: 3e 61 70 46 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  >apFunc = 0;.  }
5880: 0a 20 20 70 41 67 67 2d 3e 70 43 75 72 72 65 6e  .  pAgg->pCurren
5890: 74 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e 6e  t = 0;.  pAgg->n
58a0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d  Mem = 0;.  pAgg-
58b0: 3e 73 65 61 72 63 68 69 6e 67 20 3d 20 30 3b 0a  >searching = 0;.
58c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
58d0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  OK;.}.../*.** De
58e0: 6c 65 74 65 20 61 20 6b 65 79 6c 69 73 74 0a 2a  lete a keylist.*
58f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5900: 62 65 4b 65 79 6c 69 73 74 46 72 65 65 28 4b 65  beKeylistFree(Ke
5910: 79 6c 69 73 74 20 2a 70 29 7b 0a 20 20 77 68 69  ylist *p){.  whi
5920: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 4b 65 79  le( p ){.    Key
5930: 6c 69 73 74 20 2a 70 4e 65 78 74 20 3d 20 70 2d  list *pNext = p-
5940: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
5950: 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 70  teFree(p);.    p
5960: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
5970: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
5980: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
5990: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
59a0: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
59b0: 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f  happens.** to ho
59c0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
59d0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
59e0: 72 28 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  r(Cursor *pCx){.
59f0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
5a00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5a10: 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73    if( pCx->pCurs
5a20: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
5a30: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
5a40: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
5a50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
5a60: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
5a70: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
5a80: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ->pBt);.  }.  sq
5a90: 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 70 44  liteFree(pCx->pD
5aa0: 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ata);.  sqliteFr
5ab0: 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 0a  ee(pCx->aType);.
5ac0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 78    sqliteFree(pCx
5ad0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
5ae0: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a 2f  e all cursors.*/
5af0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
5b00: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
5b10: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
5b20: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d    if( p->apCsr==
5b30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
5b40: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
5b50: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  sor; i++){.    s
5b60: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
5b70: 72 73 6f 72 28 70 2d 3e 61 70 43 73 72 5b 69 5d  rsor(p->apCsr[i]
5b80: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 5b  );.    p->apCsr[
5b90: 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = 0;.  }.}../
5ba0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
5bb0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
5bc0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
5bd0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
5be0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
5bf0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
5c00: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
5c10: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
5c20: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
5c30: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
5c40: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
5c50: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
5c60: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
5c70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
5c80: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
5c90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
5ca0: 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72  >aStack ){.    r
5cb0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
5cc0: 2d 3e 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70  ->aStack, 1 + (p
5cd0: 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61  ->pTos - p->aSta
5ce0: 63 6b 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f  ck));.    p->pTo
5cf0: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d  s = &p->aStack[-
5d00: 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  1];.  }.  closeA
5d10: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
5d20: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5d30: 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
5d40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73  );.  if( p->pLis
5d50: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
5d60: 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65 65 28  VdbeKeylistFree(
5d70: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  p->pList);.    p
5d80: 2d 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d  ->pList = 0;.  }
5d90: 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78  .  if( p->contex
5da0: 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  tStack ){.    fo
5db0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74  r(i=0; i<p->cont
5dc0: 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b  extStackTop; i++
5dd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5de0: 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65 65 28  VdbeKeylistFree(
5df0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
5e00: 69 5d 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  i].pList);.    }
5e10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
5e20: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
5e30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
5e40: 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28 70  dbeSorterReset(p
5e50: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5e60: 70 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  p->nAgg; i++){. 
5e70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 67     sqlite3VdbeAg
5e80: 67 52 65 73 65 74 28 30 2c 20 26 70 2d 3e 61 70  gReset(0, &p->ap
5e90: 41 67 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a  Agg[i], 0);.  }.
5ea0: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
5eb0: 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  k = 0;.  p->cont
5ec0: 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20  extStackDepth = 
5ed0: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
5ee0: 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73  tackTop = 0;.  s
5ef0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72  qliteFree(p->zEr
5f00: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
5f10: 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Msg = 0;.}../*.*
5f20: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
5f30: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
5f40: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
5f50: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
5f60: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
5f70: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
5f80: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
5f90: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
5fa0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
5fb0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
5fc0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
5fd0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
5fe0: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
5ff0: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
6000: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
6010: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
6020: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
6030: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
6040: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
6050: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
6060: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
6070: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 30  t n;.  assert( 0
6080: 3d 3d 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  ==p->nResColumn 
6090: 29 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  );.  p->nResColu
60a0: 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b  mn = nResColumn;
60b0: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
60c0: 6e 2a 32 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  n*2;.  p->aColNa
60d0: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
60e0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  (Mem*)sqliteMall
60f0: 6f 63 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  oc( sizeof(Mem)*
6100: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
6110: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
6120: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
6130: 20 3e 20 30 20 29 7b 0a 20 20 20 20 28 70 43 6f   > 0 ){.    (pCo
6140: 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20  lName++)->flags 
6150: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a  = MEM_Null;.  }.
6160: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
6170: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
6180: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
6190: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
61a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
61b0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
61c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
61d0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
61e0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
61f0: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
6200: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
6210: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
6220: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
6230: 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54  ** If N==P3_STAT
6240: 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61  IC  it means tha
6250: 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69  t zName is a poi
6260: 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61  nter to a consta
6270: 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72  nt static.** str
6280: 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a  ing and we can j
6290: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
62a0: 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50  nter. If it is P
62b0: 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  3_DYNAMIC, then 
62c0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
62d0: 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  s freed using sq
62e0: 6c 69 74 65 46 72 65 65 28 29 20 77 68 65 6e 20  liteFree() when 
62f0: 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e 69  the vdbe is fini
6300: 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e  shed with.** it.
6310: 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79   Otherwise, N by
6320: 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65  tes of zName are
6330: 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20   copied..*/.int 
6340: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6350: 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69  lName(Vdbe *p, i
6360: 6e 74 20 69 64 78 2c 20 63 6f 6e 73 74 20 63 68  nt idx, const ch
6370: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
6380: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
6390: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
63a0: 61 73 73 65 72 74 28 20 69 64 78 3c 28 32 2a 70  assert( idx<(2*p
63b0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29 3b  ->nResColumn) );
63c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
63d0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
63e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
63f0: 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  EM;.  assert( p-
6400: 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
6410: 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
6420: 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 5d 29  ->aColName[idx])
6430: 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59  ;.  if( N==P3_DY
6440: 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53  NAMIC || N==P3_S
6450: 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20  TATIC ){.    rc 
6460: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
6470: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
6480: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
6490: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
64a0: 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
64b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
64c0: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
64d0: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
64e0: 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   N, SQLITE_UTF8,
64f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
6500: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6510: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d  =SQLITE_OK && N=
6520: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P3_DYNAMIC ){. 
6530: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
6540: 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  gs = (pColName->
6550: 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74  flags&(~MEM_Stat
6560: 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20  ic))|MEM_Dyn;.  
6570: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c    pColName->xDel
6580: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
6590: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
65a0: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
65b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
65c0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
65d0: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
65e0: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
65f0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
6600: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
6610: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
6620: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
6630: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
6640: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
6650: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
6660: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
6670: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
6680: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6690: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
66a0: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
66b0: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
66c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
66d0: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
66e0: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
66f0: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
6700: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
6710: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
6720: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6730: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
6740: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
6750: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6760: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
6770: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
6780: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
6790: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
67a0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
67b0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
67c0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
67d0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
67e0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
67f0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
6800: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
6810: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
6820: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
6830: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
6840: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
6850: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
6860: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  k ){.    int rc;
6870: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
6880: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
6890: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
68a0: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
68b0: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  mitArg);.    sql
68c0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
68d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
68e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
68f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
6900: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6910: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
6920: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
6930: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
6940: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
6950: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
6960: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
6970: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
6980: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
6990: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
69a0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
69b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
69c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
69d0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
69e0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
69f0: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
6a00: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
6a10: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
6a20: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
6a30: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  .  In that case 
6a40: 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73  we do.  ** not s
6a50: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
6a60: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
6a70: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d  , so use the sim
6a80: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20  ple case then.  
6a90: 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ** too..  */.  i
6aa0: 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c  f( 0==strlen(sql
6ab0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
6ac0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
6ad0: 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c  pBt)) || nTrans<
6ae0: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =1 ){.    for(i=
6af0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
6b00: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
6b10: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
6b20: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
6b30: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
6b40: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
6b50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6b60: 72 65 65 53 79 6e 63 28 70 42 74 2c 20 30 29 3b  reeSync(pBt, 0);
6b70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6b80: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
6b90: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
6ba0: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
6bb0: 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 20 2a  ssfully synced *
6bc0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
6bd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
6bf0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
6c00: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
6c10: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
6c20: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 20          if( pBt 
6c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6c40: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
6c50: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
6c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6c70: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
6c80: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
6c90: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
6ca0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6cb0: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
6cc0: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
6cd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6ce0: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
6cf0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
6d00: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
6d10: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 20  atomicly..  */. 
6d20: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
6d30: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
6d40: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
6d50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6d60: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
6d70: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
6d80: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
6d90: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
6da0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
6db0: 4f 73 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 0a  OsFile master;..
6dc0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
6dd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6de0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
6df0: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72  do {.      u32 r
6e00: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c  andom;.      sql
6e10: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
6e20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
6e30: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
6e40: 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f  (random), &rando
6e50: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
6e60: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
6e70: 74 66 28 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20  tf("%s-mj%08X", 
6e80: 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f  zMainFile, rando
6e90: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
6ea0: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
6eb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
6ec0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6ed0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  ;.      }.    }w
6ee0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 46  hile( sqlite3OsF
6ef0: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
6f00: 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  r) );..    /* Op
6f10: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
6f20: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 6d 65  urnal. */.    me
6f30: 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c  mset(&master, 0,
6f40: 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29   sizeof(master))
6f50: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
6f60: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
6f70: 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  e(zMaster, &mast
6f80: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
6f90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6fb0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
6fc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6fd0: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
6fe0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
6ff0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
7000: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
7010: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
7020: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
7030: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
7040: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7050: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
7060: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
7070: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
7080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
7090: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
70a0: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
70b0: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
70c0: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
70d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
70e0: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
70f0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
7100: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
7110: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
7120: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
7130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
7140: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
7150: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
7160: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7170: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
7180: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f   ) continue;   /
7190: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d  * Ignore the TEM
71a0: 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
71b0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
71c0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
71d0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
71e0: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
71f0: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
7200: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
7210: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
7220: 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
7230: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
7240: 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79  * Ignore :memory
7250: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
7260: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7270: 74 65 33 4f 73 57 72 69 74 65 28 26 6d 61 73 74  te3OsWrite(&mast
7280: 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65  er, zFile, strle
7290: 6e 28 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20 20  n(zFile)+1);.   
72a0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
72b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
72c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
72d0: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20  se(&master);.   
72e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
72f0: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
7300: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7310: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
7320: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7330: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
7340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20       }.    }... 
7350: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
7360: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7370: 6c 65 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  le. Before doing
7380: 20 74 68 69 73 2c 20 6f 70 65 6e 20 74 68 65 20   this, open the 
7390: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 2a 2a  directory.    **
73a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
73b0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 74 6f 72  nal file is stor
73c0: 65 20 69 6e 20 73 6f 20 74 68 61 74 20 69 74 20  e in so that it 
73d0: 67 65 74 73 20 73 79 6e 63 65 64 20 74 6f 6f 2e  gets synced too.
73e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69  .    */.    zMai
73f0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
7400: 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64  treeGetDirname(d
7410: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
7420: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7430: 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
7440: 7a 4d 61 69 6e 46 69 6c 65 2c 20 26 6d 61 73 74  zMainFile, &mast
7450: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
7460: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 72  =SQLITE_OK || (r
7470: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
7480: 63 28 26 6d 61 73 74 65 72 29 29 21 3d 53 51 4c  c(&master))!=SQL
7490: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
74a0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
74b0: 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  master);.      s
74c0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
74d0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
74e0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
74f0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
7500: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
7510: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
7520: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
7530: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
7540: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
7550: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
7560: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7570: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
7580: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
7590: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
75a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
75b0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
75c0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
75d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
75e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
75f0: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
7600: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
7610: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7620: 42 74 72 65 65 53 79 6e 63 28 29 2c 0a 20 20 20  BtreeSync(),.   
7630: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
7640: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
7650: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7660: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a  al file will be.
7670: 20 20 20 20 2a 2a 20 6f 72 70 68 61 6e 65 64 2e      ** orphaned.
7680: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
7690: 65 6c 65 74 65 20 69 74 2c 20 69 6e 20 63 61 73  elete it, in cas
76a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
76b0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
76c0: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
76d0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
76e0: 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  al file before t
76f0: 68 65 20 66 61 69 6c 75 72 65 0a 20 20 20 20 2a  he failure.    *
7700: 2a 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a  * occured..    *
7710: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
7720: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
7730: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
7740: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
7750: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
7760: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
7770: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
7780: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
7790: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
77a0: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
77b0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
77c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
77d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
77e0: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
77f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7800: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
7810: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7820: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
7830: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7840: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7850: 6d 61 73 74 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  master);..    /*
7860: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
7870: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
7880: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
7890: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
78a0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
78b0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
78c0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
78d0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
78e0: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
78f0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
7900: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
7910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
7920: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7930: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (zMaster);.    a
7940: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
7950: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69  E_OK );.    sqli
7960: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
7970: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
7980: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
7990: 65 33 4f 73 53 79 6e 63 44 69 72 65 63 74 6f 72  e3OsSyncDirector
79a0: 79 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  y(zMainFile);.  
79b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
79c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
79d0: 54 68 69 73 20 69 73 20 6e 6f 74 20 67 6f 6f 64  This is not good
79e0: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
79f0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
7a00: 65 6e 20 64 65 6c 65 74 65 64 2c 20 62 75 74 0a  en deleted, but.
7a10: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 72        ** the dir
7a20: 65 63 74 6f 72 79 20 73 79 6e 63 20 66 61 69 6c  ectory sync fail
7a30: 65 64 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ed. There is no 
7a40: 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 66 65 20  completely safe 
7a50: 63 6f 75 72 73 65 20 6f 66 0a 20 20 20 20 20 20  course of.      
7a60: 2a 2a 20 61 63 74 69 6f 6e 20 66 72 6f 6d 20 68  ** action from h
7a70: 65 72 65 2e 20 54 68 65 20 69 6e 64 69 76 69 64  ere. The individ
7a80: 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e  ual journals con
7a90: 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
7aa0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61   the.      ** ma
7ab0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
7ac0: 65 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20  e, but there is 
7ad0: 6e 6f 20 77 61 79 20 6f 66 20 6b 6e 6f 77 69 6e  no way of knowin
7ae0: 67 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  g if that.      
7af0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
7b00: 6c 20 65 78 69 73 74 73 20 6e 6f 77 20 6f 72 20  l exists now or 
7b10: 69 66 20 69 74 20 77 69 6c 6c 20 65 78 69 73 74  if it will exist
7b20: 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
7b30: 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 73 79  ting.      ** sy
7b40: 73 74 65 6d 20 63 72 61 73 68 20 74 68 61 74 20  stem crash that 
7b50: 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66  may follow the f
7b60: 73 79 6e 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  sync() failure..
7b70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
7b80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
7b90: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
7ba0: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
7bb0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
7bc0: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
7bd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
7be0: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
7bf0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
7c00: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
7c10: 6e 67 20 66 69 6c 65 73 20 61 6e 64 20 64 65 6c  ng files and del
7c20: 65 74 69 6e 67 0a 20 20 20 20 2a 2a 20 6a 6f 75  eting.    ** jou
7c30: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
7c40: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
7c50: 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
7c60: 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 0a  pening we don't.
7c70: 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20 63 61      ** really ca
7c80: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
7c90: 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  y of the transac
7ca0: 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
7cb0: 67 75 61 72 61 6e 74 65 65 64 2c 0a 20 20 20 20  guaranteed,.    
7cc0: 2a 2a 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  ** but some stra
7cd0: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
7ce0: 73 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  s may be lying a
7cf0: 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
7d00: 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72   an.    ** error
7d10: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
7d20: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
7d30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7d40: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
7d50: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
7d60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7d70: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
7d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7d90: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
7da0: 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
7db0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
7dc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
7dd0: 6e 64 20 65 76 65 72 79 20 61 63 74 69 76 65 20  nd every active 
7de0: 56 4d 20 6f 74 68 65 72 20 74 68 61 6e 20 70 56  VM other than pV
7df0: 64 62 65 20 61 6e 64 20 63 68 61 6e 67 65 20 69  dbe and change i
7e00: 74 73 20 73 74 61 74 75 73 20 74 6f 0a 2a 2a 20  ts status to.** 
7e10: 61 62 6f 72 74 65 64 2e 20 20 54 68 69 73 20 68  aborted.  This h
7e20: 61 70 70 65 6e 73 20 77 68 65 6e 20 6f 6e 65 20  appens when one 
7e30: 56 4d 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  VM causes a roll
7e40: 62 61 63 6b 20 64 75 65 20 74 6f 20 61 6e 0a 2a  back due to an.*
7e50: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f  * ON CONFLICT RO
7e60: 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65 20 28 66  LLBACK clause (f
7e70: 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20 20 54 68  or example).  Th
7e80: 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74  e other VMs must
7e90: 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65 64 20 73   be.** aborted s
7ea0: 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e  o that they do n
7eb0: 6f 74 20 68 61 76 65 20 64 61 74 61 20 72 6f 6c  ot have data rol
7ec0: 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  led out from und
7ed0: 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68 65 6d 20  erneath.** them 
7ee0: 6c 65 61 64 69 6e 67 20 74 6f 20 61 20 73 65 67  leading to a seg
7ef0: 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  fault..*/.static
7f00: 20 76 6f 69 64 20 61 62 6f 72 74 4f 74 68 65 72   void abortOther
7f10: 41 63 74 69 76 65 56 64 62 65 73 28 56 64 62 65  ActiveVdbes(Vdbe
7f20: 20 2a 70 56 64 62 65 29 7b 0a 20 20 56 64 62 65   *pVdbe){.  Vdbe
7f30: 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f 72 28   *pOther;.  for(
7f40: 70 4f 74 68 65 72 3d 70 56 64 62 65 2d 3e 64 62  pOther=pVdbe->db
7f50: 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72 3b  ->pVdbe; pOther;
7f60: 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d 3e   pOther=pOther->
7f70: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
7f80: 70 4f 74 68 65 72 3d 3d 70 56 64 62 65 20 29 20  pOther==pVdbe ) 
7f90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
7fa0: 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67 69 63 21  ( pOther->magic!
7fb0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
7fc0: 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63 3c 30 20  || pOther->pc<0 
7fd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7fe0: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
7ff0: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 70 4f 74  pOther);.    pOt
8000: 68 65 72 2d 3e 61 62 6f 72 74 65 64 20 3d 20 31  her->aborted = 1
8010: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
8020: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
8030: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
8040: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
8050: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
8060: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
8070: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
8080: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
8090: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
80a0: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
80b0: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
80c0: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
80d0: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
80e0: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
80f0: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
8100: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
8110: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
8120: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
8130: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
8140: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
8150: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
8160: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
8170: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
8180: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
8190: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
81a0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
81b0: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
81c0: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
81d0: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
81e0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
81f0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
8200: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
8210: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
8220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
8230: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
8240: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
8250: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
8260: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
8270: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
8280: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
8290: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
82a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
82b0: 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
82c0: 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
82d0: 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
82e0: 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
82f0: 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
8300: 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
8310: 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
8320: 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
8330: 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
8340: 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
8350: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
8360: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
8370: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
8380: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
8390: 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
83a0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
83b0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
83c0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
83d0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
83e0: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
83f0: 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
8400: 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
8410: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
8420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
8430: 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
8440: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
8450: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
8460: 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
8470: 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
8480: 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
8490: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
84a0: 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
84b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
84c0: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
84d0: 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42    int (*xFunc)(B
84e0: 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20  tree *pBt) = 0; 
84f0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8500: 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72  call on each btr
8510: 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 0a 20  ee backend */.. 
8520: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
8530: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
8540: 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  .    /* Already 
8550: 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67  halted.  Nothing
8560: 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61   to do. */.    a
8570: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
8580: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
8590: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
85a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
85b0: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
85c0: 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  p);.  checkActiv
85d0: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
85e0: 69 66 28 20 70 2d 3e 70 63 3c 30 20 29 7b 0a 20  if( p->pc<0 ){. 
85f0: 20 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20     /* No commit 
8600: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
8610: 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
8620: 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
8630: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  */.  }else if( d
8640: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26  b->autoCommit &&
8650: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
8660: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  nt==1 ){.    if(
8670: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
8680: 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
8690: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
86a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
86b0: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
86c0: 20 74 72 75 65 2c 20 74 68 65 72 65 20 61 72 65   true, there are
86d0: 20 6e 6f 20 6f 74 68 65 72 20 61 63 74 69 76 65   no other active
86e0: 20 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a   queries.      *
86f0: 2a 20 75 73 69 6e 67 20 74 68 69 73 20 68 61 6e  * using this han
8700: 64 6c 65 20 61 6e 64 20 74 68 65 20 76 64 62 65  dle and the vdbe
8710: 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
8720: 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61  cessful or hit a
8730: 6e 0a 20 20 20 20 20 20 2a 2a 20 27 4f 52 20 46  n.      ** 'OR F
8740: 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e  AIL' constraint.
8750: 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
8760: 6d 6d 69 74 20 69 73 20 72 65 71 75 69 72 65 64  mmit is required
8770: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8780: 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f   int rc = vdbeCo
8790: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  mmit(db);.      
87a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
87b0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  USY ){.        r
87c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
87d0: 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  Y;.      }else i
87e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
87f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
8800: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
8810: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
8820: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  treeRollback;.  
8830: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8840: 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73  .      xFunc = s
8850: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
8860: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ack;.    }.  }el
8870: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  se{.    if( p->r
8880: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
8890: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
88a0: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
88b0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
88c0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b  BtreeCommitStmt;
88d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
88e0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
88f0: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
8900: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
8910: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
8920: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
8930: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
8940: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
8950: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f  ;.      db->auto
8960: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
8970: 20 20 61 62 6f 72 74 4f 74 68 65 72 41 63 74 69    abortOtherActi
8980: 76 65 56 64 62 65 73 28 70 29 3b 0a 20 20 20 20  veVdbes(p);.    
8990: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 78  }.  }..  /* If x
89a0: 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Func is not NULL
89b0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65  , then it is one
89c0: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
89d0: 52 6f 6c 6c 62 61 63 6b 2c 0a 20 20 2a 2a 20 73  Rollback,.  ** s
89e0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
89f0: 61 63 6b 53 74 6d 74 20 6f 72 20 73 71 6c 69 74  ackStmt or sqlit
8a00: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
8a10: 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20  t. Call it once 
8a20: 6f 6e 0a 20 20 2a 2a 20 65 61 63 68 20 62 61 63  on.  ** each bac
8a30: 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  kend. If an erro
8a40: 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  r occurs and the
8a50: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
8a60: 73 74 69 6c 6c 0a 20 20 2a 2a 20 53 51 4c 49 54  still.  ** SQLIT
8a70: 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65  E_OK, set the re
8a80: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65  turn code to the
8a90: 20 6e 65 77 20 65 72 72 6f 72 20 76 61 6c 75 65   new error value
8aa0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
8ab0: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
8ac0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
8ad0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
8ae0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8af0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
8b00: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 72  ( pBt ){.      r
8b10: 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a  c = xFunc(pBt);.
8b20: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
8b30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
8b40: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
8b50: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
8b60: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
8b70: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
8b80: 2c 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65  , set the change
8b90: 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 69   counter. */.  i
8ba0: 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
8bb0: 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  n && p->pc>=0 ){
8bc0: 0a 20 20 20 20 69 66 28 20 21 78 46 75 6e 63 20  .    if( !xFunc 
8bd0: 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65  || xFunc==sqlite
8be0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
8bf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8c00: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
8c10: 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
8c20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8c40: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
8c50: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 68      }.    p->nCh
8c60: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ange = 0;.  }.. 
8c70: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20   /* Rollback or 
8c80: 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d  commit any schem
8c90: 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f  a changes that o
8ca0: 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 69 66  ccurred. */.  if
8cb0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
8cc0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
8cd0: 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  3RollbackInterna
8ce0: 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
8cf0: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c  }else if( db->fl
8d00: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
8d10: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
8d20: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
8d30: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
8d40: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  b);.  }..  /* We
8d50: 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
8d60: 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
8d70: 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
8d80: 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
8d90: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
8da0: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74  0 ){.    db->act
8db0: 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iveVdbeCnt--;.  
8dc0: 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
8dd0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
8de0: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
8df0: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74  eCnt(db);..  ret
8e00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8e10: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
8e20: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
8e30: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
8e40: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
8e50: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
8e60: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
8e70: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
8e80: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
8e90: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
8ea0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
8eb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
8ec0: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
8ed0: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
8ee0: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
8ef0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
8f00: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
8f10: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
8f20: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
8f30: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
8f40: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
8f50: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
8f60: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
8f70: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
8f80: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
8f90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
8fa0: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
8fb0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  ){.  if( p->magi
8fc0: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
8fd0: 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56  N && p->magic!=V
8fe0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
8ff0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
9000: 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  or(p->db, SQLITE
9010: 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20  _MISUSE, 0);.   
9020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
9030: 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ISUSE;.  }..  /*
9040: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
9050: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
9060: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
9070: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
9080: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
9090: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
90a0: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
90b0: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
90c0: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
90d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
90e0: 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
90f0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
9100: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
9110: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
9120: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
9130: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
9140: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
9150: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
9160: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
9170: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
9180: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
9190: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
91a0: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
91b0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
91c0: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
91d0: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
91e0: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
91f0: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
9200: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
9210: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
9220: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
9230: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
9240: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9250: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
9260: 63 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 45 72 72  c, "%s", p->zErr
9270: 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
9280: 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  teFree(p->zErrMs
9290: 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  g);.      p->zEr
92a0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
92b0: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
92c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
92d0: 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63  ror(p->db, p->rc
92e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
92f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9300: 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  ror(p->db, SQLIT
9310: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E_OK, 0);.    }.
9320: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
9330: 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
9340: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
9350: 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
9360: 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
9370: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
9380: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
9390: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
93a0: 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
93b0: 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
93c0: 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
93d0: 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
93e0: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
93f0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
9400: 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
9410: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d   sqlite3Error(p-
9420: 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  >db, p->rc, 0);.
9430: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
9440: 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
9450: 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
9460: 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
9470: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
9480: 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
9490: 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
94a0: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   run..  */.  ass
94b0: 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d  ert( p->pTos<&p-
94c0: 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f  >aStack[p->pc<0?
94d0: 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 73 71 6c 69  0:p->pc] || sqli
94e0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
94f0: 64 3d 3d 31 20 29 3b 0a 23 69 66 64 65 66 20 56  d==1 );.#ifdef V
9500: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
9510: 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
9520: 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
9530: 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
9540: 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
9550: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9560: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
9570: 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
9580: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
9590: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
95a0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
95b0: 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
95c0: 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
95d0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
95e0: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
95f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
9600: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
9610: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
9620: 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
9630: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
9640: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
9650: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
9660: 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
9670: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
9680: 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
9690: 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
96a0: 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
96b0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
96c0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
96d0: 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
96e0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
96f0: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
9700: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
9710: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
9720: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
9730: 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b   p->aborted = 0;
9740: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9750: 4c 49 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20  LITE_SCHEMA ){. 
9760: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
9770: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 70 2d  nternalSchema(p-
9780: 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  >db, 0);.  }.  r
9790: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 20  eturn p->rc;.}. 
97a0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
97b0: 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
97c0: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
97d0: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
97e0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
97f0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
9800: 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
9810: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
9820: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
9830: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
9840: 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
9850: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
9860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
9870: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
9880: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
9890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
98a0: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
98b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
98c0: 52 65 73 65 74 28 70 29 3b 0a 20 20 7d 65 6c 73  Reset(p);.  }els
98d0: 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d  e if( p->magic!=
98e0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
98f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9900: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
9910: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
9920: 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
9930: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
9940: 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74  all the destruct
9950: 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64  or for each auxd
9960: 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64  ata entry in pVd
9970: 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68  beFunc for which
9980: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
9990: 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73  nding bit in mas
99a0: 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78  k is clear.  Aux
99b0: 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79  data entries bey
99c0: 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c  ond 31.** are al
99d0: 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20  ways destroyed. 
99e0: 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20   To destroy all 
99f0: 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c  auxdata entries,
9a00: 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f   call this.** ro
9a10: 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d  utine with mask=
9a20: 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =0..*/.void sqli
9a30: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
9a40: 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70  Data(VdbeFunc *p
9a50: 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61  VdbeFunc, int ma
9a60: 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sk){.  int i;.  
9a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65  for(i=0; i<pVdbe
9a80: 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29  Func->nAux; i++)
9a90: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78  {.    struct Aux
9aa0: 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56  Data *pAux = &pV
9ab0: 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69  dbeFunc->apAux[i
9ac0: 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31  ];.    if( (i>31
9ad0: 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69   || !(mask&(1<<i
9ae0: 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75  ))) && pAux->pAu
9af0: 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  x ){.      if( p
9b00: 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
9b10: 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
9b20: 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
9b30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b40: 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b   pAux->pAux = 0;
9b50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9b60: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
9b70: 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
9b80: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
9b90: 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
9ba0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
9bb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43  =0 ) return;.  C
9bc0: 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66 28  leanup(p);.  if(
9bd0: 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
9be0: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
9bf0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
9c00: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9c10: 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d  ( p->db->pVdbe==
9c20: 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e  p );.    p->db->
9c30: 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
9c40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
9c50: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
9c60: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
9c70: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
9c80: 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  ( p->aOp ){.    
9c90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
9ca0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4f  p; i++){.      O
9cb0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
9cc0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
9cd0: 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44  Op->p3type==P3_D
9ce0: 59 4e 41 4d 49 43 20 7c 7c 20 70 4f 70 2d 3e 70  YNAMIC || pOp->p
9cf0: 33 74 79 70 65 3d 3d 50 33 5f 4b 45 59 49 4e 46  3type==P3_KEYINF
9d00: 4f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  O ){.        sql
9d10: 69 74 65 46 72 65 65 28 70 4f 70 2d 3e 70 33 29  iteFree(pOp->p3)
9d20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d30: 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d  if( pOp->p3type=
9d40: 3d 50 33 5f 56 44 42 45 46 55 4e 43 20 29 7b 0a  =P3_VDBEFUNC ){.
9d50: 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63          VdbeFunc
9d60: 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56   *pVdbeFunc = (V
9d70: 64 62 65 46 75 6e 63 20 2a 29 70 4f 70 2d 3e 70  dbeFunc *)pOp->p
9d80: 33 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  3;.        sqlit
9d90: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
9da0: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
9db0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9dc0: 65 46 72 65 65 28 70 56 64 62 65 46 75 6e 63 29  eFree(pVdbeFunc)
9dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9de0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
9df0: 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ->aOp);.  }.  re
9e00: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
9e10: 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
9e20: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
9e30: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  >aLabel);.  sqli
9e40: 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63 6b  teFree(p->aStack
9e50: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
9e60: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
9e70: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
9e80: 32 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  2);.  sqliteFree
9e90: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20  (p->aColName);. 
9ea0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
9eb0: 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73  _MAGIC_DEAD;.  s
9ec0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
9ed0: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  ./*.** If a Move
9ee0: 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
9ef0: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
9f00: 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
9f10: 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
9f20: 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e  eTo now.  Return
9f30: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
9f40: 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73   If no MoveTo is
9f50: 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a   pending, this.*
9f60: 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  * routine does n
9f70: 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72  othing and retur
9f80: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
9f90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9fa0: 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72  CursorMoveto(Cur
9fb0: 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
9fc0: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
9fd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
9fe0: 20 72 63 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   rc;.    extern 
9ff0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
a000: 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61 73  ch_count;.    as
a010: 73 65 72 74 28 20 70 2d 3e 69 6e 74 4b 65 79 20  sert( p->intKey 
a020: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
a030: 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  tKey ){.      rc
a040: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
a050: 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72  oveto(p->pCursor
a060: 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
a070: 72 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20 20  rget, &res);.   
a080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
a090: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
a0a0: 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72  oveto(p->pCursor
a0b0: 2c 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65  ,(char*)&p->move
a0c0: 74 6f 54 61 72 67 65 74 2c 0a 20 20 20 20 20 20  toTarget,.      
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
a0f0: 36 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d  64),&res);.    }
a100: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
a110: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d  turn rc;.    *p-
a120: 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20  >pIncrKey = 0;. 
a130: 20 20 20 70 2d 3e 6c 61 73 74 52 65 63 6e 6f 20     p->lastRecno 
a140: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
a150: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
a160: 20 70 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69 64   p->recnoIsValid
a170: 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69   = res==0;.    i
a180: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
a190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
a1a0: 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73  reeNext(p->pCurs
a1b0: 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
a1c0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a1d0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   rc;.    }.    s
a1e0: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
a1f0: 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64 65  unt++;.    p->de
a200: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
a210: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 56 61  ;.    p->cacheVa
a220: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  lid = 0;.  }.  r
a230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
a250: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
a260: 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
a270: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
a280: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
a290: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
a2a0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
a2b0: 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c  ialRead().** sql
a2c0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
a2d0: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
a2e0: 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a  beSerialWrite().
a2f0: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
a300: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
a310: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
a320: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
a330: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
a340: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
a350: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
a360: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
a370: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
a380: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
a390: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
a3a0: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
a3b0: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
a3c0: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
a3d0: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
a3e0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
a3f0: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
a400: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
a410: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
a420: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
a430: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
a440: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
a450: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
a460: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
a470: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
a480: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
a490: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
a4a0: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
a4b0: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
a4c0: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
a4d0: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
a4e0: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
a4f0: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
a500: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
a510: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
a520: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
a530: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
a540: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
a550: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
a560: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
a570: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
a580: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
a590: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
a5a0: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
a5d0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
a5e0: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
a610: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
a640: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
a650: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
a660: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
a670: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
a680: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
a6b0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
a6c0: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
a6e0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
a6f0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
a700: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
a710: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
a720: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
a730: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
a760: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
a770: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
a780: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
a790: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
a7a0: 6f 61 74 0a 2a 2a 20 20 20 20 20 38 2d 31 31 20  oat.**     8-11 
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a7d0: 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
a7e0: 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
a7f0: 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
a800: 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
a810: 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
a820: 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
a830: 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
a840: 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a   text.**.*/../*.
a850: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
a860: 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
a870: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
a880: 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
a890: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
a8a0: 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b  Type(Mem *pMem){
a8b0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
a8c0: 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 69  Mem->flags;..  i
a8d0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
a8e0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
a8f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
a900: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
a910: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
a920: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
a930: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
a940: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
a950: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
a960: 28 28 69 36 34 29 30 78 30 30 30 31 30 30 30 30  ((i64)0x00010000
a970: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
a980: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20  4 i = pMem->i;. 
a990: 20 20 20 75 36 34 20 75 20 3d 20 69 3c 30 20 3f     u64 u = i<0 ?
a9a0: 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28   -i : i;.    if(
a9b0: 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e   u<=127 ) return
a9c0: 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33   1;.    if( u<=3
a9d0: 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
a9e0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
a9f0: 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
aa00: 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
aa10: 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
aa20: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
aa30: 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
aa40: 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
aa50: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
aa60: 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
aa70: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
aa80: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 53   if( flags&MEM_S
aa90: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  tr ){.    int n 
aaa0: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 61  = pMem->n;.    a
aab0: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
aac0: 20 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29     return ((n*2)
aad0: 20 2b 20 31 33 29 3b 0a 20 20 7d 0a 20 20 69 66   + 13);.  }.  if
aae0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ( flags&MEM_Blob
aaf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
ab00: 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 32 29 3b  pMem->n*2 + 12);
ab10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
ab20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ab30: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
ab40: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
ab50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
ab60: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
ab70: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
ab80: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
ab90: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
aba0: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
abb0: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
abc0: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
abd0: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
abe0: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
abf0: 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
ac00: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
ac10: 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
ac20: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
ac30: 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
ac40: 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
ac50: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
ac60: 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
ac70: 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
ac80: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
ac90: 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
aca0: 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
acb0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
acc0: 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
acd0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
ace0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
acf0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
ad00: 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69 6e 74 20 73  itten..*/ .int s
ad10: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ad20: 50 75 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61  Put(unsigned cha
ad30: 72 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  r *buf, Mem *pMe
ad40: 6d 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c  m){.  u32 serial
ad50: 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
ad60: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d  dbeSerialType(pM
ad70: 65 6d 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  em);.  int len;.
ad80: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  .  /* NULL */.  
ad90: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
ada0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
adb0: 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 49   0;.  }. .  /* I
adc0: 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
add0: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
ade0: 74 79 70 65 3c 3d 37 20 29 7b 0a 20 20 20 20 75  type<=7 ){.    u
adf0: 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b  64 v;.    int i;
ae00: 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
ae10: 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
ae20: 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65   v = *(u64*)&pMe
ae30: 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  m->r;.    }else{
ae40: 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75 36 34  .      v = *(u64
ae50: 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20  *)&pMem->i;.    
ae60: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
ae70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ae80: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
ae90: 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c 65  type);.    while
aea0: 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
aeb0: 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29  uf[i] = (v&0xFF)
aec0: 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
aed0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
aee0: 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 0a 20 20  n len;.  }.  .  
aef0: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
af00: 62 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  b */.  assert( s
af10: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
af20: 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ;.  len = sqlite
af30: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
af40: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
af50: 0a 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70  .  memcpy(buf, p
af60: 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
af70: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f  return len;.}../
af80: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
af90: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
afa0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
afb0: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
afc0: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
afd0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
afe0: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
aff0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
b000: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
b010: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
b020: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
b030: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
b040: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
b050: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
b060: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
b070: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b090: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
b0a0: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
b0b0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b0d0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
b0e0: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
b0f0: 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 65  o */.){.  int le
b100: 6e 3b 0a 0a 20 20 69 66 28 20 73 65 72 69 61 6c  n;..  if( serial
b110: 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
b120: 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 70  /* NULL */.    p
b130: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
b140: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 72 65 74 75 72  _Null;.    retur
b150: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6c 65 6e 20 3d  n 0;.  }.  len =
b160: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
b170: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
b180: 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65  _type);.  if( se
b190: 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 29 7b 0a  rial_type<=7 ){.
b1a0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61      /* Integer a
b1b0: 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 20 20 69  nd Real */.    i
b1c0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
b1d0: 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 33 32  4 ){.      /* 32
b1e0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 74 79 70  -bit integer typ
b1f0: 65 2e 20 20 54 68 69 73 20 69 73 20 68 61 6e 64  e.  This is hand
b200: 6c 65 64 20 62 79 20 61 20 73 70 65 63 69 61 6c  led by a special
b210: 20 63 61 73 65 20 66 6f 72 0a 20 20 20 20 20 20   case for.      
b220: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  ** performance r
b230: 65 61 73 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 20  easons. */.     
b240: 20 69 6e 74 20 76 20 3d 20 62 75 66 5b 30 5d 3b   int v = buf[0];
b250: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
b260: 20 20 20 20 69 66 28 20 76 26 30 78 38 30 20 29      if( v&0x80 )
b270: 7b 0a 20 20 20 20 20 20 20 20 76 20 7c 3d 20 2d  {.        v |= -
b280: 32 35 36 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  256;.      }.   
b290: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 6c 65     for(n=1; n<le
b2a0: 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; n++){.       
b2b0: 20 76 20 3d 20 28 76 3c 3c 38 29 20 7c 20 62 75   v = (v<<8) | bu
b2c0: 66 5b 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f[n];.      }.  
b2d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
b2e0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
b2f0: 20 70 4d 65 6d 2d 3e 69 20 3d 20 76 3b 0a 20 20   pMem->i = v;.  
b300: 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20      return n;.  
b310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
b320: 36 34 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  64 v = 0;.      
b330: 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20 69 66  int n;..      if
b340: 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 7b  ( buf[0]&0x80 ){
b350: 0a 20 20 20 20 20 20 20 20 76 20 3d 20 2d 31 3b  .        v = -1;
b360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
b370: 6f 72 28 6e 3d 30 3b 20 6e 3c 6c 65 6e 3b 20 6e  or(n=0; n<len; n
b380: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  ++){.        v =
b390: 20 28 76 3c 3c 38 29 20 7c 20 62 75 66 5b 6e 5d   (v<<8) | buf[n]
b3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b3b0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
b3c0: 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =7 ){.        pM
b3d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b3e0: 52 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 4d  Real;.        pM
b3f0: 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f 75 62 6c 65  em->r = *(double
b400: 2a 29 26 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73  *)&v;.      }els
b410: 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
b420: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b430: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
b440: 69 20 3d 20 2a 28 69 36 34 2a 29 26 76 3b 0a 20  i = *(i64*)&v;. 
b450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b460: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74 72  else{.    /* Str
b470: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
b480: 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61     assert( seria
b490: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 3b 0a 20 20  l_type>=12 );.  
b4a0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
b4b0: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 70 4d 65  r *)buf;.    pMe
b4c0: 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
b4d0: 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
b4e0: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
b4f0: 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
b500: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b510: 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
b520: 68 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  hem;.    }else{.
b530: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b540: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
b550: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d 0a  EM_Ephem;.    }.
b560: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e    }.  return len
b570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b580: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
b590: 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
b5a0: 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
b5b0: 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 64 20  cords specified 
b5c0: 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70  by .** {nKey1, p
b5d0: 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79 32  Key1} and {nKey2
b5e0: 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72 6e  , pKey2}, return
b5f0: 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c 20  ing a negative, 
b600: 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
b610: 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b  ive integer if {
b620: 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73  nKey1, pKey1} is
b630: 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
b640: 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
b650: 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32 2c  ter than {nKey2,
b660: 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20 4b   pKey2}.  Both K
b670: 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75 73  ey1 and Key2 mus
b680: 74 20 62 65 20 62 79 74 65 20 73 74 72 69 6e 67  t be byte string
b690: 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62 79  s.** composed by
b6a0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
b6b0: 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
b6c0: 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71   VDBE..*/.int sq
b6d0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
b6e0: 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a  ompare(.  void *
b6f0: 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20  userData,.  int 
b700: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
b710: 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74  d *pKey1, .  int
b720: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
b730: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 4b  id *pKey2.){.  K
b740: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
b750: 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73 65   = (KeyInfo*)use
b760: 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31 2c  rData;.  u32 d1,
b770: 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   d2;          /*
b780: 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
b790: 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
b7a0: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
b7b0: 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20 20  2 idx1, idx2;   
b7c0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
b7d0: 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
b7e0: 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
b7f0: 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 2c  */.  u32 szHdr1,
b800: 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75 6d   szHdr2;  /* Num
b810: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b820: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
b830: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69  i = 0;.  int nFi
b840: 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  eld;.  int rc = 
b850: 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
b860: 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
b870: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
b880: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
b890: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
b8a0: 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20 28   char *aKey2 = (
b8b0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
b8c0: 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20  har *)pKey2;..  
b8d0: 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20  Mem mem1;.  Mem 
b8e0: 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  mem2;.  mem1.enc
b8f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
b900: 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20 70  ;.  mem2.enc = p
b910: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
b920: 0a 20 20 69 64 78 31 20 3d 20 73 71 6c 69 74 65  .  idx1 = sqlite
b930: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b 65  3GetVarint32(pKe
b940: 79 31 2c 20 26 73 7a 48 64 72 31 29 3b 0a 20 20  y1, &szHdr1);.  
b950: 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69  d1 = szHdr1;.  i
b960: 64 78 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dx2 = sqlite3Get
b970: 56 61 72 69 6e 74 33 32 28 70 4b 65 79 32 2c 20  Varint32(pKey2, 
b980: 26 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20 3d  &szHdr2);.  d2 =
b990: 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c   szHdr2;.  nFiel
b9a0: 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
b9b0: 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
b9c0: 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 64  dx1<szHdr1 && id
b9d0: 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20 20  x2<szHdr2 ){.   
b9e0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
b9f0: 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  1;.    u32 seria
ba00: 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a  l_type2;..    /*
ba10: 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
ba20: 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
ba30: 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
ba40: 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
ba50: 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 47  idx1 += sqlite3G
ba60: 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
ba70: 31 5b 69 64 78 31 5d 2c 20 26 73 65 72 69 61 6c  1[idx1], &serial
ba80: 5f 74 79 70 65 31 29 3b 0a 20 20 20 20 69 66 28  _type1);.    if(
ba90: 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
baa0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
bab0: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
bac0: 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
bad0: 20 20 20 20 69 64 78 32 20 2b 3d 20 73 71 6c 69      idx2 += sqli
bae0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  te3GetVarint32(&
baf0: 61 4b 65 79 32 5b 69 64 78 32 5d 2c 20 26 73 65  aKey2[idx2], &se
bb00: 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 20 20 20  rial_type2);.   
bb10: 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26   if( d2>=nKey2 &
bb20: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
bb30: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
bb40: 6c 5f 74 79 70 65 32 29 3e 30 20 29 20 62 72 65  l_type2)>0 ) bre
bb50: 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73 65  ak;..    /* Asse
bb60: 72 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73  rt that there is
bb70: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65   enough space le
bb80: 66 74 20 69 6e 20 65 61 63 68 20 6b 65 79 20 66  ft in each key f
bb90: 6f 72 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a 20  or the blob of. 
bba0: 20 20 20 2a 2a 20 64 61 74 61 20 74 6f 20 67 6f     ** data to go
bbb0: 20 77 69 74 68 20 74 68 65 20 73 65 72 69 61 6c   with the serial
bbc0: 20 74 79 70 65 20 6a 75 73 74 20 72 65 61 64 2e   type just read.
bbd0: 20 54 68 69 73 20 61 73 73 65 72 74 20 6d 61 79   This assert may
bbe0: 20 66 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a 20   fail if.    ** 
bbf0: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
bc00: 75 70 74 65 64 2e 20 20 54 68 65 6e 20 72 65 61  upted.  Then rea
bc10: 64 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  d the value from
bc20: 20 65 61 63 68 20 6b 65 79 20 69 6e 74 6f 20 6d   each key into m
bc30: 65 6d 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6d  em1.    ** and m
bc40: 65 6d 32 20 72 65 73 70 65 63 74 69 76 65 6c 79  em2 respectively
bc50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
bc60: 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
bc70: 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
bc80: 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
bc90: 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 64 32  , &mem1);.    d2
bca0: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
bcb0: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 32 5b  erialGet(&aKey2[
bcc0: 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d2], serial_type
bcd0: 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20  2, &mem2);..    
bce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
bcf0: 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d  ompare(&mem1, &m
bd00: 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20 3f 20  em2, i<nField ? 
bd10: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
bd20: 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c  i] : 0);.    sql
bd30: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
bd40: 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 73  se(&mem1);.    s
bd50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
bd60: 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20  ease(&mem2);.   
bd70: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
bd80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bd90: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
bda0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b   /* One of the k
bdb0: 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
bdc0: 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74  ields, but all t
bdd0: 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
bde0: 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20  that point.  ** 
bdf0: 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
be00: 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20  he incrKey flag 
be10: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
be20: 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a  e second key is.
be30: 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20    ** treated as 
be40: 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  larger..  */.  i
be50: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
be60: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e  if( pKeyInfo->in
be70: 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  crKey ){.      r
be80: 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  c = -1;.    }els
be90: 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29  e if( d1<nKey1 )
bea0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
beb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32      }else if( d2
bec0: 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20  <nKey2 ){.      
bed0: 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  rc = -1;.    }. 
bee0: 20 7d 0a 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   }..  if( pKeyIn
bef0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
bf00: 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  & i<pKeyInfo->nF
bf10: 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f  ield && pKeyInfo
bf20: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
bf30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
bf40: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
bf50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
bf60: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69  argument is an i
bf70: 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f  ndex entry compo
bf80: 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  sed using the OP
bf90: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
bfa0: 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  de..** The last 
bfb0: 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65  entry in this re
bfc0: 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61  cord should be a
bfd0: 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69  n integer (speci
bfe0: 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  fically.** an in
bff0: 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54  teger rowid).  T
c000: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
c010: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
c020: 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68  f bytes in.** th
c030: 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  at integer..*/.i
c040: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
c050: 78 52 6f 77 69 64 4c 65 6e 28 69 6e 74 20 6e 4b  xRowidLen(int nK
c060: 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  ey, const u8 *aK
c070: 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72  ey){.  u32 szHdr
c080: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
c090: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
c0a0: 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
c0b0: 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
c0c0: 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
c0d0: 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47  d */..  sqlite3G
c0e0: 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
c0f0: 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69   &szHdr);.  sqli
c100: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  te3GetVarint32(&
c110: 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26  aKey[szHdr-1], &
c120: 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 72 65  typeRowid);.  re
c130: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
c140: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79  SerialTypeLen(ty
c150: 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a  peRowid);.}.  ..
c160: 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
c170: 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
c180: 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
c190: 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
c1a0: 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
c1b0: 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
c1c0: 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
c1d0: 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
c1e0: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
c1f0: 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
c200: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
c210: 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
c220: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
c230: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
c240: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
c250: 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
c260: 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
c270: 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
c280: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
c290: 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
c2a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
c2b0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
c2c0: 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
c2d0: 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
c2e0: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
c2f0: 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
c300: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
c310: 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
c320: 20 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   v;..  sqlite3Bt
c330: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
c340: 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69   &nCellKey);.  i
c350: 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29  f( nCellKey<=0 )
c360: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c370: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
c380: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
c390: 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
c3a0: 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  pCur, 0, nCellKe
c3b0: 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
c3c0: 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
c3d0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  n rc;.  }.  sqli
c3e0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 6d  te3GetVarint32(m
c3f0: 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  .z, &szHdr);.  s
c400: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
c410: 32 28 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  2(&m.z[szHdr-1],
c420: 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20   &typeRowid);.  
c430: 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
c440: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
c450: 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
c460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
c470: 69 61 6c 47 65 74 28 26 6d 2e 7a 5b 6d 2e 6e 2d  ialGet(&m.z[m.n-
c480: 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
c490: 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
c4a0: 77 69 64 20 3d 20 76 2e 69 3b 0a 20 20 73 71 6c  wid = v.i;.  sql
c4b0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
c4c0: 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
c4d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c4e0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
c4f0: 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
c500: 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
c510: 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20  sor pC is point 
c520: 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
c530: 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
c540: 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20  pKey (of length 
c550: 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e  nKey).  Write in
c560: 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
c570: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
c580: 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
c590: 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
c5a0: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
c5b0: 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
c5c0: 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20  ater than pKey. 
c5d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c5e0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
c5f0: 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68  .** pKey is eith
c600: 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
c610: 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
c620: 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
c630: 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
c640: 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
c650: 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
c660: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
c670: 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
c680: 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
c690: 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ell..*/.int sqli
c6a0: 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
c6b0: 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a  pare(.  Cursor *
c6c0: 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
c6d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
c6e0: 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
c6f0: 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  inst */.  int nK
c700: 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ey, const u8 *pK
c710: 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  ey,   /* The key
c720: 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
c730: 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c750: 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
c760: 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
c770: 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
c780: 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b  llKey;.  int rc;
c790: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
c7a0: 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
c7b0: 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b  .  int lenRowid;
c7c0: 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c  .  Mem m;..  sql
c7d0: 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
c7e0: 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
c7f0: 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
c800: 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73  y<=0 ){.    *res
c810: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
c820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c830: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
c840: 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
c850: 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e  C->pCursor, 0, n
c860: 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
c870: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
c880: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
c890: 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
c8a0: 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
c8b0: 4c 65 6e 28 6d 2e 6e 2c 20 6d 2e 7a 29 3b 0a 20  Len(m.n, m.z);. 
c8c0: 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
c8d0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
c8e0: 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d  (pC->pKeyInfo, m
c8f0: 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a  .n-lenRowid, m.z
c900: 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
c910: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
c920: 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
c930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c940: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
c950: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
c960: 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
c970: 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
c980: 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
c990: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
c9a0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
c9b0: 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
c9c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c9d0: 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
c9e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
c9f0: 61 6e 67 65 29 7b 0a 20 20 64 62 2d 3e 6e 43 68  ange){.  db->nCh
ca00: 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
ca10: 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
ca20: 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
ca30: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
ca40: 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
ca50: 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
ca60: 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
ca70: 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
ca80: 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
ca90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
caa0: 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
cab0: 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
cac0: 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
cad0: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
cae0: 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
caf0: 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
cb00: 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
cb10: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
cb20: 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
cb30: 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
cb40: 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
cb50: 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
cb60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
cb70: 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
cb80: 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
cb90: 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
cba0: 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
cbb0: 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
cbc0: 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
cbd0: 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
cbe0: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
cbf0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
cc00: 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
cc10: 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
cc20: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
cc30: 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
cc40: 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
cc50: 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
cc60: 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
cc70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cc80: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
cc90: 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
cca0: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
ccb0: 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
ccc0: 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
ccd0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
cce0: 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
ccf0: 0a                                               .