/ Hex Artifact Content
Login

Artifact 3c2f1d5df1ac21e20a9795f4a988f663b01f7b83:


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 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50   ){.    if( n==P
1df0: 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 6e 3d 3d  3_DYNAMIC || n==
1e00: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
1e10: 46 46 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FF ){.      sqli
1e20: 74 65 46 72 65 65 28 7a 50 33 29 3b 0a 20 20 20  teFree(zP3);.   
1e30: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
1e40: 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20   }.  if( addr<0 
1e50: 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20  || addr>=p->nOp 
1e60: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
1e70: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
1e80: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
1e90: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
1ea0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
1eb0: 69 66 28 20 70 4f 70 2d 3e 70 33 20 26 26 20 70  if( pOp->p3 && p
1ec0: 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44  Op->p3type==P3_D
1ed0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 73 71  YNAMIC ){.    sq
1ee0: 6c 69 74 65 46 72 65 65 28 70 4f 70 2d 3e 70 33  liteFree(pOp->p3
1ef0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
1f00: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50   0;.  }.  if( zP
1f10: 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  3==0 ){.    pOp-
1f20: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  >p3 = 0;.    pOp
1f30: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f  ->p3type = P3_NO
1f40: 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TUSED;.  }else i
1f50: 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f  f( n==P3_KEYINFO
1f60: 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
1f70: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  *pKeyInfo;.    i
1f80: 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65  nt nField, nByte
1f90: 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28  ;.    nField = (
1fa0: 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 33 29 2d 3e  (KeyInfo*)zP3)->
1fb0: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74  nField;.    nByt
1fc0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  e = sizeof(*pKey
1fd0: 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d  Info) + (nField-
1fe0: 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e  1)*sizeof(pKeyIn
1ff0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 3b 0a 20  fo->aColl[0]);. 
2000: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
2010: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
2020: 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d  Byte );.    pOp-
2030: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65  >p3 = (char*)pKe
2040: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
2050: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
2060: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
2070: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
2080: 20 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65       pOp->p3type
2090: 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P3_KEYINFO;. 
20a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20b0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
20c0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a  _NOTUSED;.    }.
20d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
20e0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
20f0: 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  F ){.    pOp->p3
2100: 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20   = (char*)zP3;. 
2110: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
2120: 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P3_KEYINFO;.  }
2130: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
2140: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
2150: 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f  har*)zP3;.    pO
2160: 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a 20  p->p3type = n;. 
2170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2180: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65  n==0 ) n = strle
2190: 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f 70 2d  n(zP3);.    pOp-
21a0: 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  >p3 = sqliteStrN
21b0: 44 75 70 28 7a 50 33 2c 20 6e 29 3b 0a 20 20 20  Dup(zP3, n);.   
21c0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
21d0: 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  3_DYNAMIC;.  }.}
21e0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
21f0: 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
2200: 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 74  he P3 field of t
2210: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2220: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
2230: 6f 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65  on with.** comme
2240: 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64  nt text..*/.void
2250: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
2260: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
2270: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2280: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2290: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
22a0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
22b0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
22c0: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
22d0: 2d 31 5d 2e 70 33 3d 3d 30 20 29 3b 0a 20 20 76  -1].p3==0 );.  v
22e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
22f0: 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mat);.  sqlite3V
2300: 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 2d  dbeChangeP3(p, -
2310: 31 2c 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e  1, sqlite3VMPrin
2320: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c  tf(zFormat, ap),
2330: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
2340: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2350: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
2360: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 74 6f  he P3 operand to
2370: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
2380: 6e 73 74 72 75 63 74 69 6f 6e 20 61 70 70 65 61  nstruction appea
2390: 72 73 0a 2a 2a 20 74 6f 20 62 65 20 61 20 71 75  rs.** to be a qu
23a0: 6f 74 65 64 20 73 74 72 69 6e 67 20 74 6f 6b 65  oted string toke
23b0: 6e 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f  n, then this pro
23c0: 63 65 64 75 72 65 20 72 65 6d 6f 76 65 73 20 0a  cedure removes .
23d0: 2a 2a 20 74 68 65 20 71 75 6f 74 65 73 2e 0a 2a  ** the quotes..*
23e0: 2a 0a 2a 2a 20 54 68 65 20 71 75 6f 74 69 6e 67  *.** The quoting
23f0: 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65   operator can be
2400: 20 65 69 74 68 65 72 20 61 20 67 72 61 76 65 20   either a grave 
2410: 61 73 63 65 6e 74 20 28 41 53 43 49 49 20 30 78  ascent (ASCII 0x
2420: 32 37 29 0a 2a 2a 20 6f 72 20 61 20 64 6f 75 62  27).** or a doub
2430: 6c 65 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  le quote charact
2440: 65 72 20 28 41 53 43 49 49 20 30 78 32 32 29 2e  er (ASCII 0x22).
2450: 20 20 54 77 6f 20 71 75 6f 74 65 73 20 69 6e 20    Two quotes in 
2460: 61 20 72 6f 77 0a 2a 2a 20 72 65 73 6f 6c 76 65  a row.** resolve
2470: 20 74 6f 20 62 65 20 61 20 73 69 6e 67 6c 65 20   to be a single 
2480: 61 63 74 75 61 6c 20 71 75 6f 74 65 20 63 68 61  actual quote cha
2490: 72 61 63 74 65 72 20 77 69 74 68 69 6e 20 74 68  racter within th
24a0: 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  e string..*/.voi
24b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 71  d sqlite3VdbeDeq
24c0: 75 6f 74 65 50 33 28 56 64 62 65 20 2a 70 2c 20  uoteP3(Vdbe *p, 
24d0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 4f 70 20  int addr){.  Op 
24e0: 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  *pOp;.  assert( 
24f0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2500: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2510: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 20 72  f( p->aOp==0 ) r
2520: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 61 64 64  eturn;.  if( add
2530: 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e  r<0 || addr>=p->
2540: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64 64 72 20  nOp ){.    addr 
2550: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
2560: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72    if( addr<0 ) r
2570: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70  eturn;.  }.  pOp
2580: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
2590: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3d  ;.  if( pOp->p3=
25a0: 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 33 5b 30 5d  =0 || pOp->p3[0]
25b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
25c0: 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d  if( pOp->p3type=
25d0: 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20  =P3_STATIC ){.  
25e0: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69    pOp->p3 = sqli
25f0: 74 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70 33  teStrDup(pOp->p3
2600: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79  );.    pOp->p3ty
2610: 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b  pe = P3_DYNAMIC;
2620: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2630: 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44  Op->p3type==P3_D
2640: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 73 71 6c 69  YNAMIC );.  sqli
2650: 74 65 33 44 65 71 75 6f 74 65 28 70 4f 70 2d 3e  te3Dequote(pOp->
2660: 70 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  p3);.}../*.** Se
2670: 61 72 63 68 20 74 68 65 20 63 75 72 72 65 6e 74  arch the current
2680: 20 70 72 6f 67 72 61 6d 20 73 74 61 72 74 69 6e   program startin
2690: 67 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  g at instruction
26a0: 20 61 64 64 72 20 66 6f 72 20 74 68 65 20 67 69   addr for the gi
26b0: 76 65 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e  ven.** opcode an
26c0: 64 20 50 32 20 76 61 6c 75 65 2e 20 20 52 65 74  d P2 value.  Ret
26d0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
26e0: 70 6c 75 73 20 31 20 69 66 20 66 6f 75 6e 64 20  plus 1 if found 
26f0: 61 6e 64 20 30 20 69 66 20 6e 6f 74 0a 2a 2a 20  and 0 if not.** 
2700: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
2710: 6c 69 74 65 33 56 64 62 65 46 69 6e 64 4f 70 28  lite3VdbeFindOp(
2720: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2730: 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  r, int op, int p
2740: 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  2){.  int i;.  a
2750: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
2760: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2770: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 61 64 64 72   );.  for(i=addr
2780: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
2790: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70  {.    if( p->aOp
27a0: 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 26  [i].opcode==op &
27b0: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3d 3d  & p->aOp[i].p2==
27c0: 70 32 20 29 20 72 65 74 75 72 6e 20 69 2b 31 3b  p2 ) return i+1;
27d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27f0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
2800: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
2810: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
2820: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
2830: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
2840: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2850: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2860: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2870: 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ( addr>=0 && add
2880: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65  r<p->nOp );.  re
2890: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
28a0: 72 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  r];.}..#if !defi
28b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
28c0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
28d0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
28e0: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
28f0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
2900: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
2910: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
2920: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
2930: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
2940: 50 33 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P3 parameter for
2950: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
2960: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
2970: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
2980: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
2990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
29a0: 20 2a 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a   *displayP3(Op *
29b0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
29c0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
29d0: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73  char *zP3;.  ass
29e0: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
29f0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
2a00: 3e 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p3type ){.    c
2a10: 61 73 65 20 50 33 5f 50 4f 49 4e 54 45 52 3a 20  ase P3_POINTER: 
2a20: 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
2a30: 7a 54 65 6d 70 2c 20 22 70 74 72 28 25 23 78 29  zTemp, "ptr(%#x)
2a40: 22 2c 20 28 69 6e 74 29 70 4f 70 2d 3e 70 33 29  ", (int)pOp->p3)
2a50: 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  ;.      zP3 = zT
2a60: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
2a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2a80: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P3_KEYINFO: {. 
2a90: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
2aa0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2ab0: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66  eyInfo = (KeyInf
2ac0: 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20  o*)pOp->p3;.    
2ad0: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
2ae0: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
2af0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
2b00: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c  ;.      i = strl
2b10: 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  en(zTemp);.     
2b20: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
2b30: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
2b40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
2b50: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
2b60: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
2b70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
2b80: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
2b90: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
2ba0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
2bb0: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
2bc0: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
2bd0: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
2be0: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 29 3b  Temp[i],",...");
2bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2c00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2c10: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
2c20: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
2c30: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
2c40: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
2c50: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
2c60: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
2c70: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
2c80: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
2c90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ca0: 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69   strcpy(&zTemp[i
2cb0: 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ], pColl->zName)
2cc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
2cd0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
2ce0: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
2cf0: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  6 ){.          s
2d00: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  trcpy(&zTemp[i],
2d10: 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20 20  ",nil");.       
2d20: 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
2d30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d40: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
2d50: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
2d60: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
2d70: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
2d80: 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  ;.      zP3 = zT
2d90: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
2da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2db0: 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P3_COLLSEQ: {. 
2dc0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2dd0: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 2a 29  oll = (CollSeq*)
2de0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
2df0: 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 63  printf(zTemp, "c
2e00: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
2e10: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
2e20: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
2e30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2e40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33     }.    case P3
2e50: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
2e60: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
2e70: 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70 2d  = (FuncDef*)pOp-
2e80: 3e 70 33 3b 0a 20 20 20 20 20 20 63 68 61 72 20  >p3;.      char 
2e90: 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zNum[30];.      
2ea0: 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22  sprintf(zTemp, "
2eb0: 25 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c 20 70 44  %.*s", nTemp, pD
2ec0: 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ef->zName);.    
2ed0: 20 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d 2c 22    sprintf(zNum,"
2ee0: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 6e 41 72  (%d)", pDef->nAr
2ef0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  g);.      if( st
2f00: 72 6c 65 6e 28 7a 54 65 6d 70 29 2b 73 74 72 6c  rlen(zTemp)+strl
2f10: 65 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e 54 65 6d  en(zNum)+1<=nTem
2f20: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  p ){.        str
2f30: 63 61 74 28 7a 54 65 6d 70 2c 20 7a 4e 75 6d 29  cat(zTemp, zNum)
2f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f50: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
2f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2f70: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
2f80: 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e       zP3 = pOp->
2f90: 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  p3;.      if( zP
2fa0: 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  3==0 || pOp->opc
2fb0: 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  ode==OP_Noop ){.
2fc0: 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22          zP3 = ""
2fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 50 33    }.  return zP3
2ff0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3000: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
3010: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
3020: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
3030: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
3040: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
3050: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3060: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
3070: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
3080: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
3090: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
30a0: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
30b0: 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63    char *zP3;.  c
30c0: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
30d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
30e0: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
30f0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
3100: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
3110: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
3120: 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64  tdout;.  zP3 = d
3130: 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50  isplayP3(pOp, zP
3140: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
3150: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  );.  fprintf(pOu
3160: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20  t, zFormat1,.   
3170: 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70     pc, sqlite3Op
3180: 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f  codeNames[pOp->o
3190: 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c  pcode], pOp->p1,
31a0: 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a   pOp->p2, zP3);.
31b0: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
31c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
31d0: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
31e0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
31f0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
3200: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
3210: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
3220: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
3230: 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b   while( N-->0 ){
3240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3250: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b 2b  beMemRelease(p++
3260: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
3270: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3280: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
3290: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
32a0: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
32b0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
32c0: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
32d0: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
32e0: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
32f0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
3300: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
3310: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
3320: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
3330: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
3340: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
3350: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
3360: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
3370: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
3380: 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  AIN"..*/.int sql
3390: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
33a0: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
33b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33c0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71   VDBE */.){.  sq
33d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
33e0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
33f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
3400: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
3410: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  explain );.  if(
3420: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
3430: 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75  MAGIC_RUN ) retu
3440: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
3450: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
3460: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
3470: 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73  GIC_BUSY );.  as
3480: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
3490: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
34a0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
34b0: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
34c0: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
34d0: 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d  es not put dynam
34e0: 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20  ic strings onto 
34f0: 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  the.  ** the sta
3500: 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65 63  ck, they may bec
3510: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74  ome dynamic if t
3520: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20  he user calls.  
3530: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
3540: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73  n_text16(), caus
3550: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f  ing a translatio
3560: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f  n to UTF-16 enco
3570: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ding..  */.  if(
3580: 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61 53   p->pTos==&p->aS
3590: 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20 72  tack[4] ){.    r
35a0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
35b0: 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20 20  ->aStack, 5);.  
35c0: 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63  }.  p->resOnStac
35d0: 6b 20 3d 20 30 3b 0a 0a 0a 20 20 69 20 3d 20 70  k = 0;...  i = p
35e0: 2d 3e 70 63 2b 2b 3b 0a 20 20 69 66 28 20 69 3e  ->pc++;.  if( i>
35f0: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
3600: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
3610: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
3620: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
3630: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
3640: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
3650: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
3660: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3670: 65 72 72 75 70 74 3b 0a 20 20 20 20 70 2d 3e 72  errupt;.    p->r
3680: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
3690: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
36a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
36b0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
36c0: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
36d0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
36e0: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
36f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
3700: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
3710: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
3720: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
3730: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
3740: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
3750: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
3760: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
3770: 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20  em->i = i;      
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
37a0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
37b0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
37c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
37d0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
37e0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
37f0: 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65  pMem->z = sqlite
3800: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70  3OpcodeNames[pOp
3810: 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f  ->opcode];  /* O
3820: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65  pcode */.    pMe
3830: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
3840: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
3850: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
3860: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
3870: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
3880: 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  8;.    pMem++;..
3890: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
38a0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
38b0: 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31  Mem->i = pOp->p1
38c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
38d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
38e0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
38f0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
3900: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
3910: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
3920: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
3930: 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e   pMem->i = pOp->
3940: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3960: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
3970: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
3980: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
3990: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
39a0: 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c  ags = MEM_Short|
39b0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
39c0: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
39d0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
39e0: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
39f0: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
3a00: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
3a10: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
3a20: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
3a30: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
3a40: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
3a50: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
3a60: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
3a70: 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  pMem;.    p->rc 
3a80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
3a90: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
3aa0: 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
3ab0: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
3ac0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
3ad0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
3ae0: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  T_EXPLAIN */../*
3af0: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
3b00: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
3b10: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
3b20: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
3b30: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
3b40: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
3b50: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
3b60: 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70 20  DEBUG.  int nOp 
3b70: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
3b80: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
3b90: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
3ba0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
3bb0: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
3bc0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
3bd0: 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20  p && pOp->p3!=0 
3be0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
3bf0: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  r *z = pOp->p3;.
3c00: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
3c10: 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b  ce(*(u8*)z) ) z+
3c20: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
3c30: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
3c40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
3c50: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
3c60: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
3c70: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
3c80: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
3c90: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
3ca0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
3cb0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
3cc0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
3cd0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
3ce0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
3cf0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
3d00: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
3d10: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
3d20: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
3d30: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
3d40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
3d50: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
3d60: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
3d70: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3d80: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
3d90: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
3da0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
3db0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
3de0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3e10: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
3e20: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
3e30: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3e60: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
3e70: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
3e80: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ea0: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
3eb0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
3ec0: 0a 20 20 69 6e 74 20 6e 41 67 67 2c 20 20 20 20  .  int nAgg,    
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3ef0: 67 67 72 65 67 61 74 65 20 63 6f 6e 74 65 78 74  ggregate context
3f00: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
3f10: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f30: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
3f40: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
3f50: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
3f60: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65    int n;..  asse
3f70: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3f80: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3f90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3fa0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
3fb0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
3fc0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
3fd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3fe0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nOp>0 );..  /* N
3ff0: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76  o instruction ev
4000: 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74  er pushes more t
4010: 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  han a single ele
4020: 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20  ment onto the.  
4030: 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74  ** stack.  And t
4040: 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67  he stack never g
4050: 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69  rows on successi
4060: 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66  ve executions of
4070: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c   the.  ** same l
4080: 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74  oop.  So the tot
4090: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73  al number of ins
40a0: 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20  tructions is an 
40b0: 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a  upper bound.  **
40c0: 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   on the maximum 
40d0: 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71 75  stack depth requ
40e0: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
40f0: 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74  Allocation all t
4100: 68 65 20 73 74 61 63 6b 20 73 70 61 63 65 20 77  he stack space w
4110: 65 20 77 69 6c 6c 20 65 76 65 72 20 6e 65 65 64  e will ever need
4120: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
4130: 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  aStack==0 ){.   
4140: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
4150: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
4160: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20   nVar>=0 );.    
4170: 6e 20 3d 20 69 73 45 78 70 6c 61 69 6e 20 3f 20  n = isExplain ? 
4180: 31 30 20 3a 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  10 : p->nOp;.   
4190: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
41a0: 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  iteMalloc(.     
41b0: 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61     n*sizeof(p->a
41c0: 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 20 20 20  Stack[0])       
41d0: 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20    /* aStack */. 
41e0: 20 20 20 20 20 2b 20 6e 2a 73 69 7a 65 6f 66 28       + n*sizeof(
41f0: 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20  Mem*)           
4200: 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a        /* apArg *
4210: 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73  /.      + nVar*s
4220: 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20  izeof(Mem)      
4230: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72           /* aVar
4240: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72   */.      + nVar
4250: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20  *sizeof(char*)  
4260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a             /* az
4270: 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Var */.      + n
4280: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Mem*sizeof(Mem) 
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42a0: 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b   aMem */.      +
42b0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
42c0: 43 75 72 73 6f 72 2a 29 20 20 20 20 20 20 20 20  Cursor*)        
42d0: 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20  /* apCsr */.    
42e0: 20 20 2b 20 6e 41 67 67 2a 73 69 7a 65 6f 66 28    + nAgg*sizeof(
42f0: 41 67 67 29 20 20 20 20 20 20 20 20 20 20 20 20  Agg)            
4300: 20 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20     /* Aggregate 
4310: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20  contexts */.    
4320: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
4330: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
4340: 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  d ){.      p->aM
4350: 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  em = &p->aStack[
4360: 6e 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65  n];.      p->nMe
4370: 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  m = nMem;.      
4380: 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d  p->aVar = &p->aM
4390: 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20  em[nMem];.      
43a0: 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a  p->nVar = nVar;.
43b0: 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d        p->okVar =
43c0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41   0;.      p->apA
43d0: 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e  rg = (Mem**)&p->
43e0: 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  aVar[nVar];.    
43f0: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68    p->azVar = (ch
4400: 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e  ar**)&p->apArg[n
4410: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  ];.      p->apCs
4420: 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70  r = (Cursor**)&p
4430: 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  ->azVar[nVar];. 
4440: 20 20 20 20 20 69 66 28 20 6e 41 67 67 3e 30 20       if( nAgg>0 
4450: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 41  ){.        p->nA
4460: 67 67 20 3d 20 6e 41 67 67 3b 0a 20 20 20 20 20  gg = nAgg;.     
4470: 20 20 20 70 2d 3e 61 70 41 67 67 20 3d 20 28 41     p->apAgg = (A
4480: 67 67 2a 29 26 70 2d 3e 61 70 43 73 72 5b 6e 43  gg*)&p->apCsr[nC
4490: 75 72 73 6f 72 5d 3b 0a 20 20 20 20 20 20 7d 0a  ursor];.      }.
44a0: 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72        p->nCursor
44b0: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
44c0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
44d0: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; n++){.       
44e0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
44f0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
4500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4510: 20 20 70 2d 3e 70 41 67 67 20 3d 20 70 2d 3e 61    p->pAgg = p->a
4520: 70 41 67 67 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  pAgg;.  for(n=0;
4530: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
4540: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d  {.    p->aMem[n]
4550: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
4560: 6c 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  l;.  }..#ifdef S
4570: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
4580: 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  ( (p->db->flags 
4590: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73  & SQLITE_VdbeLis
45a0: 74 69 6e 67 29 21 3d 30 0a 20 20 20 20 7c 7c 20  ting)!=0.    || 
45b0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
45c0: 73 74 73 28 22 76 64 62 65 5f 65 78 70 6c 61 69  sts("vdbe_explai
45d0: 6e 22 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  n").  ){.    int
45e0: 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   i;.    printf("
45f0: 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73  VDBE Program Lis
4600: 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73  ting:\n");.    s
4610: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
4620: 71 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72 28 69  ql(p);.    for(i
4630: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
4640: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4650: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64  3VdbePrintOp(std
4660: 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
4670: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i]);.    }.  }. 
4680: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
4690: 6c 65 45 78 69 73 74 73 28 22 76 64 62 65 5f 74  leExists("vdbe_t
46a0: 72 61 63 65 22 29 20 29 7b 0a 20 20 20 20 70 2d  race") ){.    p-
46b0: 3e 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b  >trace = stdout;
46c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
46d0: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
46e0: 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20  ck[-1];.  p->pc 
46f0: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
4700: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
4710: 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20  uniqueCnt = 0;. 
4720: 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20   p->returnDepth 
4730: 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  = 0;.  p->errorA
4740: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
4750: 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20  ;.  p->popStack 
4760: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
4770: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
4780: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
4790: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
47a0: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
47b0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
47c0: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ILE.  {.    int 
47d0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
47e0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
47f0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
4800: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
4810: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
4820: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
4830: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
4840: 52 65 6d 6f 76 65 20 61 6e 79 20 65 6c 65 6d 65  Remove any eleme
4850: 6e 74 73 20 74 68 61 74 20 72 65 6d 61 69 6e 20  nts that remain 
4860: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 66 6f  on the sorter fo
4870: 72 20 74 68 65 20 56 44 42 45 20 67 69 76 65 6e  r the VDBE given
4880: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4890: 33 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74  3VdbeSorterReset
48a0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 77 68 69  (Vdbe *p){.  whi
48b0: 6c 65 28 20 70 2d 3e 70 53 6f 72 74 20 29 7b 0a  le( p->pSort ){.
48c0: 20 20 20 20 53 6f 72 74 65 72 20 2a 70 53 6f 72      Sorter *pSor
48d0: 74 65 72 20 3d 20 70 2d 3e 70 53 6f 72 74 3b 0a  ter = p->pSort;.
48e0: 20 20 20 20 70 2d 3e 70 53 6f 72 74 20 3d 20 70      p->pSort = p
48f0: 53 6f 72 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  Sorter->pNext;. 
4900: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
4910: 6f 72 74 65 72 2d 3e 7a 4b 65 79 29 3b 0a 20 20  orter->zKey);.  
4920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4930: 52 65 6c 65 61 73 65 28 26 70 53 6f 72 74 65 72  Release(&pSorter
4940: 2d 3e 64 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  ->data);.    sql
4950: 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 29  iteFree(pSorter)
4960: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
4970: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
4980: 73 20 61 6c 6c 6f 63 69 61 74 65 64 20 77 69 74  s allociated wit
4990: 68 20 41 67 67 45 6c 65 6d 20 70 45 6c 65 6d 2c  h AggElem pElem,
49a0: 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 0a 2a   an element of.*
49b0: 2a 20 61 67 67 72 65 67 61 74 65 20 70 41 67 67  * aggregate pAgg
49c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
49d0: 20 66 72 65 65 41 67 67 45 6c 65 6d 28 41 67 67   freeAggElem(Agg
49e0: 45 6c 65 6d 20 2a 70 45 6c 65 6d 2c 20 41 67 67  Elem *pElem, Agg
49f0: 20 2a 70 41 67 67 29 7b 0a 20 20 69 6e 74 20 69   *pAgg){.  int i
4a00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4a10: 41 67 67 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  Agg->nMem; i++){
4a20: 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
4a30: 20 26 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d   &pElem->aMem[i]
4a40: 3b 0a 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e  ;.    if( pAgg->
4a50: 61 70 46 75 6e 63 20 26 26 20 70 41 67 67 2d 3e  apFunc && pAgg->
4a60: 61 70 46 75 6e 63 5b 69 5d 20 26 26 20 28 70 4d  apFunc[i] && (pM
4a70: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4a80: 41 67 67 43 74 78 29 21 3d 30 20 29 7b 0a 20 20  AggCtx)!=0 ){.  
4a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74      sqlite3_cont
4aa0: 65 78 74 20 63 74 78 3b 0a 20 20 20 20 20 20 63  ext ctx;.      c
4ab0: 74 78 2e 70 46 75 6e 63 20 3d 20 70 41 67 67 2d  tx.pFunc = pAgg-
4ac0: 3e 61 70 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  >apFunc[i];.    
4ad0: 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20    ctx.s.flags = 
4ae0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
4af0: 63 74 78 2e 70 41 67 67 20 3d 20 70 4d 65 6d 2d  ctx.pAgg = pMem-
4b00: 3e 7a 3b 0a 20 20 20 20 20 20 63 74 78 2e 63 6e  >z;.      ctx.cn
4b10: 74 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20  t = pMem->i;.   
4b20: 20 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20 3d     ctx.isError =
4b30: 20 30 3b 0a 20 20 20 20 20 20 28 2a 63 74 78 2e   0;.      (*ctx.
4b40: 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
4b50: 29 28 26 63 74 78 29 3b 0a 20 20 20 20 20 20 70  )(&ctx);.      p
4b60: 4d 65 6d 2d 3e 7a 20 3d 20 63 74 78 2e 70 41 67  Mem->z = ctx.pAg
4b70: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  g;.      if( pMe
4b80: 6d 2d 3e 7a 21 3d 30 20 26 26 20 70 4d 65 6d 2d  m->z!=0 && pMem-
4b90: 3e 7a 21 3d 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74  >z!=pMem->zShort
4ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4bb0: 74 65 46 72 65 65 28 70 4d 65 6d 2d 3e 7a 29 3b  teFree(pMem->z);
4bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4bd0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
4be0: 65 61 73 65 28 26 63 74 78 2e 73 29 3b 0a 20 20  ease(&ctx.s);.  
4bf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
4c00: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
4c10: 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
4c20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  }.  }.  sqliteFr
4c30: 65 65 28 70 45 6c 65 6d 29 3b 0a 7d 0a 0a 2f 2a  ee(pElem);.}../*
4c40: 0a 2a 2a 20 52 65 73 65 74 20 61 6e 20 41 67 67  .** Reset an Agg
4c50: 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 6c   structure.  Del
4c60: 65 74 65 20 61 6c 6c 20 69 74 73 20 63 6f 6e 74  ete all its cont
4c70: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ents..**.** For 
4c80: 69 6e 73 74 61 6c 6c 61 62 6c 65 20 61 67 67 72  installable aggr
4c90: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c  egate functions,
4ca0: 20 69 66 20 74 68 65 20 73 74 65 70 20 66 75 6e   if the step fun
4cb0: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ction has been.*
4cc0: 2a 20 63 61 6c 6c 65 64 2c 20 6d 61 6b 65 20 73  * called, make s
4cd0: 75 72 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65  ure the finalize
4ce0: 72 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  r function has a
4cf0: 6c 73 6f 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e  lso been called.
4d00: 20 20 54 68 65 0a 2a 2a 20 66 69 6e 61 6c 69 7a    The.** finaliz
4d10: 65 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  er might need to
4d20: 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 74 68 61   free memory tha
4d30: 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  t was allocated 
4d40: 61 73 20 70 61 72 74 20 6f 66 20 69 74 73 0a 2a  as part of its.*
4d50: 2a 20 70 72 69 76 61 74 65 20 63 6f 6e 74 65 78  * private contex
4d60: 74 2e 20 20 49 66 20 74 68 65 20 66 69 6e 61 6c  t.  If the final
4d70: 69 7a 65 72 20 68 61 73 20 6e 6f 74 20 62 65 65  izer has not bee
4d80: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2c 20 63 61  n called yet, ca
4d90: 6c 6c 20 69 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a 2a  ll it.** now..**
4da0: 0a 2a 2a 20 49 66 20 64 62 20 69 73 20 4e 55 4c  .** If db is NUL
4db0: 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  L, then this is 
4dc0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
4dd0: 6d 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 65  m sqliteVdbeRese
4de0: 74 28 29 2e 20 49 6e 0a 2a 2a 20 74 68 69 73 20  t(). In.** this 
4df0: 63 61 73 65 20 63 6c 65 61 6e 20 75 70 20 61 6c  case clean up al
4e00: 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
4e10: 74 68 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 75  the temp-table u
4e20: 73 65 64 20 66 6f 72 0a 2a 2a 20 61 67 67 72 65  sed for.** aggre
4e30: 67 61 74 65 73 20 28 69 66 20 69 74 20 77 61 73  gates (if it was
4e40: 20 65 76 65 72 20 6f 70 65 6e 65 64 29 2e 0a 2a   ever opened)..*
4e50: 2a 0a 2a 2a 20 49 66 20 64 62 20 69 73 20 6e 6f  *.** If db is no
4e60: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  t NULL, then thi
4e70: 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  s is being calle
4e80: 64 20 66 72 6f 6d 20 77 69 74 68 20 61 6e 20 4f  d from with an O
4e90: 50 5f 41 67 67 52 65 73 65 74 0a 2a 2a 20 6f 70  P_AggReset.** op
4ea0: 63 6f 64 65 2e 20 4f 70 65 6e 20 74 68 65 20 74  code. Open the t
4eb0: 65 6d 70 2d 74 61 62 6c 65 2c 20 69 66 20 69 74  emp-table, if it
4ec0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
4ed0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
4ee0: 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 63  .** delete the c
4ef0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74  ontents of the t
4f00: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 61 67  able used for ag
4f10: 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
4f20: 69 6f 6e 2c 20 72 65 61 64 79 0a 2a 2a 20 66 6f  ion, ready.** fo
4f30: 72 20 74 68 65 20 6e 65 78 74 20 72 6f 75 6e 64  r the next round
4f40: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 70 72   of aggregate pr
4f50: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
4f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 52   sqlite3VdbeAggR
4f70: 65 73 65 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eset(sqlite3 *db
4f80: 2c 20 41 67 67 20 2a 70 41 67 67 2c 20 4b 65 79  , Agg *pAgg, Key
4f90: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 29 7b  Info *pKeyInfo){
4fa0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
4fb0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 3b   BtCursor *pCsr;
4fc0: 0a 0a 20 20 69 66 28 20 21 70 41 67 67 20 29 20  ..  if( !pAgg ) 
4fd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4fe0: 3b 0a 20 20 70 43 73 72 20 3d 20 70 41 67 67 2d  ;.  pCsr = pAgg-
4ff0: 3e 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74 28  >pCsr;.  assert(
5000: 20 28 70 43 73 72 20 26 26 20 70 41 67 67 2d 3e   (pCsr && pAgg->
5010: 6e 54 61 62 3e 30 29 20 7c 7c 20 28 21 70 43 73  nTab>0) || (!pCs
5020: 72 20 26 26 20 70 41 67 67 2d 3e 6e 54 61 62 3d  r && pAgg->nTab=
5030: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0).         || 
5040: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
5050: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 49  ailed );..  /* I
5060: 66 20 70 43 73 72 20 69 73 20 6e 6f 74 20 4e 55  f pCsr is not NU
5070: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62  LL, then the tab
5080: 6c 65 20 75 73 65 64 20 66 6f 72 20 61 67 67 72  le used for aggr
5090: 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
50a0: 6e 0a 20 20 2a 2a 20 69 73 20 6f 70 65 6e 2e 20  n.  ** is open. 
50b0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 69 74 20  Loop through it 
50c0: 61 6e 64 20 66 72 65 65 20 74 68 65 20 41 67 67  and free the Agg
50d0: 45 6c 65 6d 2a 20 73 74 72 75 63 74 75 72 65 20  Elem* structure 
50e0: 70 6f 69 6e 74 65 64 20 61 74 0a 20 20 2a 2a 20  pointed at.  ** 
50f0: 62 79 20 65 61 63 68 20 65 6e 74 72 79 2e 20 49  by each entry. I
5100: 66 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20  f the finalizer 
5110: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 61 6c  has not been cal
5120: 6c 65 64 20 66 6f 72 20 61 6e 20 41 67 67 45 6c  led for an AggEl
5130: 65 6d 2c 0a 20 20 2a 2a 20 64 6f 20 74 68 61 74  em,.  ** do that
5140: 20 74 6f 6f 2e 20 46 69 6e 61 6c 6c 79 2c 20 63   too. Finally, c
5150: 6c 65 61 72 20 74 68 65 20 62 74 72 65 65 20 74  lear the btree t
5160: 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  able itself..  *
5170: 2f 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a  /.  if( pCsr ){.
5180: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
5190: 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70   assert( pAgg->p
51a0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
51b0: 65 72 74 28 20 70 41 67 67 2d 3e 6e 54 61 62 3e  ert( pAgg->nTab>
51c0: 30 20 29 3b 0a 0a 20 20 20 20 72 63 3d 73 71 6c  0 );..    rc=sql
51d0: 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 70  ite3BtreeFirst(p
51e0: 43 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  Csr, &res);.    
51f0: 77 68 69 6c 65 28 20 72 65 73 3d 3d 30 20 26 26  while( res==0 &&
5200: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5210: 7b 0a 20 20 20 20 20 20 41 67 67 45 6c 65 6d 20  {.      AggElem 
5220: 2a 70 45 6c 65 6d 3b 0a 20 20 20 20 20 20 72 63  *pElem;.      rc
5230: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
5240: 61 74 61 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  ata(pCsr, 0, siz
5250: 65 6f 66 28 41 67 67 45 6c 65 6d 2a 29 2c 20 28  eof(AggElem*), (
5260: 63 68 61 72 20 2a 29 26 70 45 6c 65 6d 29 3b 0a  char *)&pElem);.
5270: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5280: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5290: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
52a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
52b0: 72 74 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63  rt( pAgg->apFunc
52c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 72 65  !=0 );.      fre
52d0: 65 41 67 67 45 6c 65 6d 28 70 45 6c 65 6d 2c 20  eAggElem(pElem, 
52e0: 70 41 67 67 29 3b 0a 20 20 20 20 20 20 72 63 3d  pAgg);.      rc=
52f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
5300: 28 70 43 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  (pCsr, &res);.  
5310: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
5320: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5330: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5340: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
5350: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
5360: 28 70 43 73 72 29 3b 0a 20 20 20 20 73 71 6c 69  (pCsr);.    sqli
5370: 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
5380: 6c 65 28 70 41 67 67 2d 3e 70 42 74 72 65 65 2c  le(pAgg->pBtree,
5390: 20 70 41 67 67 2d 3e 6e 54 61 62 29 3b 0a 20 20   pAgg->nTab);.  
53a0: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 2f 2a 20 54  }else{ .    /* T
53b0: 68 65 20 63 75 72 73 6f 72 20 6d 61 79 20 6e 6f  he cursor may no
53c0: 74 20 62 65 20 6f 70 65 6e 20 62 65 63 61 75 73  t be open becaus
53d0: 65 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  e the aggregator
53e0: 20 77 61 73 20 6e 65 76 65 72 20 75 73 65 64 2c   was never used,
53f0: 0a 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 63 6f  .    ** or it co
5400: 75 6c 64 20 62 65 20 74 68 61 74 20 69 74 20 77  uld be that it w
5410: 61 73 20 75 73 65 64 20 62 75 74 20 74 68 65 72  as used but ther
5420: 65 20 77 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e was no GROUP B
5430: 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
5440: 0a 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e 70  .    if( pAgg->p
5450: 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  Current ){.     
5460: 20 66 72 65 65 41 67 67 45 6c 65 6d 28 70 41 67   freeAggElem(pAg
5470: 67 2d 3e 70 43 75 72 72 65 6e 74 2c 20 70 41 67  g->pCurrent, pAg
5480: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
5490: 20 2f 2a 20 49 66 20 64 62 20 69 73 20 6e 6f 74   /* If db is not
54a0: 20 4e 55 4c 4c 20 61 6e 64 20 77 65 20 68 61 76   NULL and we hav
54b0: 65 20 6e 6f 74 20 79 65 74 20 61 6e 64 20 77 65  e not yet and we
54c0: 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 6f 70   have not yet op
54d0: 65 6e 65 64 0a 20 20 2a 2a 20 74 68 65 20 74 65  ened.  ** the te
54e0: 6d 70 6f 72 61 72 79 20 62 74 72 65 65 20 74 68  mporary btree th
54f0: 65 6e 20 64 6f 20 73 6f 20 61 6e 64 20 63 72 65  en do so and cre
5500: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 6f  ate the table to
5510: 20 73 74 6f 72 65 20 61 67 67 72 65 67 61 74 65   store aggregate
5520: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
5530: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  n..  **.  ** If 
5540: 64 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  db is NULL, then
5550: 20 63 6c 6f 73 65 20 74 68 65 20 74 65 6d 70 6f   close the tempo
5560: 72 61 72 79 20 62 74 72 65 65 20 69 66 20 69 74  rary btree if it
5570: 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   is open..  */. 
5580: 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69   if( db ){.    i
5590: 66 28 20 21 70 41 67 67 2d 3e 70 42 74 72 65 65  f( !pAgg->pBtree
55a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
55b0: 28 20 70 41 67 67 2d 3e 6e 54 61 62 3d 3d 30 20  ( pAgg->nTab==0 
55c0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
55d0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
55e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
55f0: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
5600: 62 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 30  b, ":memory:", 0
5610: 2c 20 54 45 4d 50 5f 50 41 47 45 53 2c 20 26 70  , TEMP_PAGES, &p
5620: 41 67 67 2d 3e 70 42 74 72 65 65 29 3b 0a 23 65  Agg->pBtree);.#e
5630: 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73  lse.      rc = s
5640: 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
5650: 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 54 45 4d  ry(db, 0, 0, TEM
5660: 50 5f 50 41 47 45 53 2c 20 26 70 41 67 67 2d 3e  P_PAGES, &pAgg->
5670: 70 42 74 72 65 65 29 3b 0a 23 65 6e 64 69 66 0a  pBtree);.#endif.
5680: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5690: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
56a0: 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
56b0: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
56c0: 73 28 70 41 67 67 2d 3e 70 42 74 72 65 65 2c 20  s(pAgg->pBtree, 
56d0: 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
56e0: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
56f0: 65 54 61 62 6c 65 28 70 41 67 67 2d 3e 70 42 74  eTable(pAgg->pBt
5700: 72 65 65 2c 20 26 70 41 67 67 2d 3e 6e 54 61 62  ree, &pAgg->nTab
5710: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
5720: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5730: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
5740: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
5750: 67 2d 3e 6e 54 61 62 21 3d 30 20 29 3b 0a 0a 20  g->nTab!=0 );.. 
5760: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5770: 74 72 65 65 43 75 72 73 6f 72 28 70 41 67 67 2d  treeCursor(pAgg-
5780: 3e 70 42 74 72 65 65 2c 20 70 41 67 67 2d 3e 6e  >pBtree, pAgg->n
5790: 54 61 62 2c 20 31 2c 0a 20 20 20 20 20 20 20 20  Tab, 1,.        
57a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
57b0: 64 43 6f 6d 70 61 72 65 2c 20 70 4b 65 79 49 6e  dCompare, pKeyIn
57c0: 66 6f 2c 20 26 70 41 67 67 2d 3e 70 43 73 72 29  fo, &pAgg->pCsr)
57d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
57e0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
57f0: 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
5800: 20 20 69 66 28 20 70 41 67 67 2d 3e 70 42 74 72    if( pAgg->pBtr
5810: 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ee ){.      sqli
5820: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 41  te3BtreeClose(pA
5830: 67 67 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 20  gg->pBtree);.   
5840: 20 20 20 70 41 67 67 2d 3e 70 42 74 72 65 65 20     pAgg->pBtree 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 67 67 2d  = 0;.      pAgg-
5860: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d  >nTab = 0;.    }
5870: 0a 20 20 20 20 70 41 67 67 2d 3e 70 43 73 72 20  .    pAgg->pCsr 
5880: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
5890: 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 29 7b 20  pAgg->apFunc ){ 
58a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
58b0: 70 41 67 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20  pAgg->apFunc);. 
58c0: 20 20 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 20     pAgg->apFunc 
58d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 41 67 67 2d  = 0;.  }.  pAgg-
58e0: 3e 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20  >pCurrent = 0;. 
58f0: 20 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b   pAgg->nMem = 0;
5900: 0a 20 20 70 41 67 67 2d 3e 73 65 61 72 63 68 69  .  pAgg->searchi
5910: 6e 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ng = 0;.  return
5920: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
5930: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6b  /*.** Delete a k
5940: 65 79 6c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  eylist.*/.void s
5950: 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c 69 73  qlite3VdbeKeylis
5960: 74 46 72 65 65 28 4b 65 79 6c 69 73 74 20 2a 70  tFree(Keylist *p
5970: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
5980: 0a 20 20 20 20 4b 65 79 6c 69 73 74 20 2a 70 4e  .    Keylist *pN
5990: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
59a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
59b0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74  );.    p = pNext
59c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
59d0: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e  lose a cursor an
59e0: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
59f0: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
5a00: 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a   cursor happens.
5a10: 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ** to hold..*/.v
5a20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
5a30: 72 65 65 43 75 72 73 6f 72 28 43 75 72 73 6f 72  reeCursor(Cursor
5a40: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
5a50: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
5a60: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
5a70: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
5a80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
5a90: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
5aa0: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  Cursor);.  }.  i
5ab0: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
5ac0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
5ad0: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
5ae0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
5af0: 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pCx->pData);.  
5b00: 73 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e  sqliteFree(pCx->
5b10: 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  aType);.  sqlite
5b20: 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a  Free(pCx);.}../*
5b30: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
5b40: 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20  rsors.*/.static 
5b50: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
5b60: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
5b70: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
5b80: 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75  >apCsr==0 ) retu
5b90: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
5ba0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
5bb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5bc0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
5bd0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20 70  apCsr[i]);.    p
5be0: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
5bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
5c00: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
5c10: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a  er execution..**
5c20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5c30: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
5c40: 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75  lly close any cu
5c50: 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e  rsors, lists, an
5c60: 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20  d/or.** sorters 
5c70: 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f  that were left o
5c80: 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65  pen.  It also de
5c90: 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73  letes the values
5ca0: 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73   of.** variables
5cb0: 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61   in the aVar[] a
5cc0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
5cd0: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
5ce0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
5cf0: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20    if( p->aStack 
5d00: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
5d10: 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b  mArray(p->aStack
5d20: 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d  , 1 + (p->pTos -
5d30: 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20   p->aStack));.  
5d40: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e    p->pTos = &p->
5d50: 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a  aStack[-1];.  }.
5d60: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
5d70: 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  s(p);.  releaseM
5d80: 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
5d90: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 69 66 28   p->nMem);.  if(
5da0: 20 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20   p->pList ){.   
5db0: 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c   sqlite3VdbeKeyl
5dc0: 69 73 74 46 72 65 65 28 70 2d 3e 70 4c 69 73 74  istFree(p->pList
5dd0: 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20  );.    p->pList 
5de0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
5df0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 29  ->contextStack )
5e00: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5e10: 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  <p->contextStack
5e20: 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Top; i++){.     
5e30: 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c   sqlite3VdbeKeyl
5e40: 69 73 74 46 72 65 65 28 70 2d 3e 63 6f 6e 74 65  istFree(p->conte
5e50: 78 74 53 74 61 63 6b 5b 69 5d 2e 70 4c 69 73 74  xtStack[i].pList
5e60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5e70: 69 74 65 46 72 65 65 28 70 2d 3e 63 6f 6e 74 65  iteFree(p->conte
5e80: 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20  xtStack);.  }.  
5e90: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
5ea0: 72 52 65 73 65 74 28 70 29 3b 0a 20 20 66 6f 72  rReset(p);.  for
5eb0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 67 67 3b  (i=0; i<p->nAgg;
5ec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
5ed0: 65 33 56 64 62 65 41 67 67 52 65 73 65 74 28 30  e3VdbeAggReset(0
5ee0: 2c 20 26 70 2d 3e 61 70 41 67 67 5b 69 5d 2c 20  , &p->apAgg[i], 
5ef0: 30 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e  0);.  }.  p->con
5f00: 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20  textStack = 0;. 
5f10: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
5f20: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
5f30: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20  contextStackTop 
5f40: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  = 0;.  sqliteFre
5f50: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
5f60: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
5f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5f80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
5f90: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
5fa0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5fb0: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
5fc0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
5fd0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
5fe0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
5ff0: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
6000: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
6010: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
6020: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
6030: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
6040: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
6050: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
6060: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
6070: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
6080: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
6090: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
60a0: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
60b0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
60c0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61  me;.  int n;.  a
60d0: 73 73 65 72 74 28 20 30 3d 3d 70 2d 3e 6e 52 65  ssert( 0==p->nRe
60e0: 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 2d 3e  sColumn );.  p->
60f0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  nResColumn = nRe
6100: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 6e 20 3d 20 6e  sColumn;.  n = n
6110: 52 65 73 43 6f 6c 75 6d 6e 2a 32 3b 0a 20 20 70  ResColumn*2;.  p
6120: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
6130: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
6140: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6150: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
6160: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
6170: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
6180: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
6190: 20 20 20 20 28 70 43 6f 6c 4e 61 6d 65 2b 2b 29      (pColName++)
61a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
61b0: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll;.  }.}../*.**
61c0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
61d0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
61e0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
61f0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
6200: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
6210: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
6220: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
6230: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
6240: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
6250: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
6260: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
6270: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
6280: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d  s()..**.** If N=
6290: 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d  =P3_STATIC  it m
62a0: 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20  eans that zName 
62b0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
62c0: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
62d0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
62e0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
62f0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66   the pointer. If
6300: 20 69 74 20 69 73 20 50 33 5f 44 59 4e 41 4d 49   it is P3_DYNAMI
6310: 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20  C, then .** the 
6320: 73 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20  string is freed 
6330: 75 73 69 6e 67 20 73 71 6c 69 74 65 46 72 65 65  using sqliteFree
6340: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
6350: 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74   is finished wit
6360: 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69  h.** it. Otherwi
6370: 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a  se, N bytes of z
6380: 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e  Name are copied.
6390: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
63a0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64  dbeSetColName(Vd
63b0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  be *p, int idx, 
63c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
63d0: 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  e, int N){.  int
63e0: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
63f0: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
6400: 69 64 78 3c 28 32 2a 70 2d 3e 6e 52 65 73 43 6f  idx<(2*p->nResCo
6410: 6c 75 6d 6e 29 20 29 3b 0a 20 20 69 66 28 20 73  lumn) );.  if( s
6420: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
6430: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
6440: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73  LITE_NOMEM;.  as
6450: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
6460: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
6470: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
6480: 6d 65 5b 69 64 78 5d 29 3b 0a 20 20 69 66 28 20  me[idx]);.  if( 
6490: 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c  N==P3_DYNAMIC ||
64a0: 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b   N==P3_STATIC ){
64b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
64c0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
64d0: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
64e0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
64f0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
6500: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6510: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
6520: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
6530: 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49  , zName, N, SQLI
6540: 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
6550: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20  RANSIENT);.  }. 
6560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6570: 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41  OK && N==P3_DYNA
6580: 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  MIC ){.    pColN
6590: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43  ame->flags = (pC
65a0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e  olName->flags&(~
65b0: 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d  MEM_Static))|MEM
65c0: 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  _Dyn;.    pColNa
65d0: 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  me->xDel = 0;.  
65e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65f0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
6600: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
6610: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
6620: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
6630: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
6640: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
6650: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
6660: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
6670: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
6680: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6690: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
66a0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
66b0: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
66c0: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
66d0: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
66e0: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
66f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6700: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
6710: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
6720: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
6730: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
6740: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
6750: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
6760: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
6770: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6780: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
6790: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  Xcommit = 0;..  
67a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
67b0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
67c0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
67d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
67e0: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
67f0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
6800: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
6810: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
6820: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
6830: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
6840: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
6850: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
6860: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
6870: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
6880: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
6890: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
68a0: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
68b0: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
68c0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c   int rc;.    sql
68d0: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
68e0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  );.    rc = db->
68f0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
6900: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
6910: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
6920: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
6930: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
6940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
6950: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
6960: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
6970: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
6980: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
6990: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
69a0: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
69b0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
69c0: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
69d0: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
69e0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
69f0: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
6a00: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
6a10: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
6a20: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
6a30: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
6a40: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
6a50: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
6a60: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
6a70: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
6a80: 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68  :memory:.  In th
6a90: 61 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20  at case we do.  
6aa0: 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  ** not support a
6ab0: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
6ac0: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
6ad0: 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   the simple case
6ae0: 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a   then.  ** too..
6af0: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74    */.  if( 0==st
6b00: 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  rlen(sqlite3Btre
6b10: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
6b20: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c  >aDb[0].pBt)) ||
6b30: 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20   nTrans<=1 ){.  
6b40: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
6b50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
6b60: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
6b70: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
6b80: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
6b90: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
6ba0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
6bb0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
6bc0: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
6bd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
6be0: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
6bf0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
6c00: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
6c10: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 20 20 69 66  synced */.    if
6c20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6c30: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
6c40: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
6c50: 29 7b 0a 20 20 20 20 20 20 20 20 42 74 72 65 65  ){.        Btree
6c60: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6c70: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  i].pBt;.        
6c80: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
6c90: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6ca0: 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  eCommit(pBt);.  
6cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6cc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6cd0: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
6ce0: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
6cf0: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
6d00: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
6d10: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
6d20: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
6d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
6d40: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
6d50: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
6d60: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
6d70: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
6d80: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
6d90: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
6da0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
6db0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
6dc0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
6dd0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
6de0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
6df0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
6e00: 74 29 3b 0a 20 20 20 20 4f 73 46 69 6c 65 20 6d  t);.    OsFile m
6e10: 61 73 74 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 53  aster;..    /* S
6e20: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
6e30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6e40: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
6e50: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20     u32 random;. 
6e60: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6e70: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
6e80: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
6e90: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
6ea0: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
6eb0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
6ec0: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2d 6d  te3MPrintf("%s-m
6ed0: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
6ee0: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
6ef0: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
6f00: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
6f10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6f20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6f30: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
6f40: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
6f50: 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a 0a 20  s(zMaster) );.. 
6f60: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
6f70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
6f80: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6d 61  /.    memset(&ma
6f90: 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ster, 0, sizeof(
6fa0: 6d 61 73 74 65 72 29 29 3b 0a 20 20 20 20 72 63  master));.    rc
6fb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
6fc0: 45 78 63 6c 75 73 69 76 65 28 7a 4d 61 73 74 65  Exclusive(zMaste
6fd0: 72 2c 20 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a  r, &master, 0);.
6fe0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6ff0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
7000: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
7010: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
7020: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
7030: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
7040: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
7050: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
7060: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
7070: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
7080: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7090: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
70a0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
70b0: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
70c0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
70d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
70e0: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
70f0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
7100: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
7110: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
7120: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
7130: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
7140: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
7150: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
7160: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
7170: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
7180: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7190: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
71a0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
71b0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
71c0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
71d0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
71e0: 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65  nue;   /* Ignore
71f0: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
7200: 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  se */.      if( 
7210: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
7220: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
7230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
7240: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
7250: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7260: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
7270: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
7280: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
7290: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
72a0: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
72b0: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ses */.        r
72c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
72d0: 74 65 28 26 6d 61 73 74 65 72 2c 20 7a 46 69 6c  te(&master, zFil
72e0: 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  e, strlen(zFile)
72f0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
7300: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7310: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7320: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
7330: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
7340: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
7350: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
7360: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
7370: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
7380: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
73a0: 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79     }...    /* Sy
73b0: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
73c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f  urnal file. Befo
73d0: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f  re doing this, o
73e0: 70 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  pen the director
73f0: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73  y.    ** the mas
7400: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7410: 20 69 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20   is store in so 
7420: 74 68 61 74 20 69 74 20 67 65 74 73 20 73 79 6e  that it gets syn
7430: 63 65 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ced too..    */.
7440: 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20      zMainFile = 
7450: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
7460: 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  irname(db->aDb[0
7470: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  ].pBt);.    rc =
7480: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
7490: 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c  rectory(zMainFil
74a0: 65 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 20  e, &master);.   
74b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
74c0: 4f 4b 20 7c 7c 20 28 72 63 20 3d 20 73 71 6c 69  OK || (rc = sqli
74d0: 74 65 33 4f 73 53 79 6e 63 28 26 6d 61 73 74 65  te3OsSync(&maste
74e0: 72 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  r))!=SQLITE_OK )
74f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
7500: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
7510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
7520: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
7530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7540: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7550: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7560: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
7570: 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
7580: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
7590: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
75a0: 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
75b0: 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
75c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
75d0: 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
75e0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
75f0: 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
7600: 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
7610: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
7620: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7630: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
7640: 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
7650: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
7660: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
7670: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
7680: 63 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  c(),.    ** then
7690: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
76a0: 63 65 20 74 68 61 74 20 74 68 65 20 6d 61 73 74  ce that the mast
76b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
76c0: 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f  will be.    ** o
76d0: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
76e0: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
76f0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  , in case the ma
7700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ster journal.   
7710: 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 20 77 61   ** file name wa
7720: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
7730: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7740: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
7750: 72 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 65  re.    ** occure
7760: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
7770: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
7780: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
7790: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
77a0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
77b0: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
77c0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
77d0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
77e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
77f0: 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20 7a 4d  treeSync(pBt, zM
7800: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
7810: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7820: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
7830: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d  qlite3OsClose(&m
7840: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
7850: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
7860: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
7870: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7890: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
78a0: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
78b0: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
78c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
78d0: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
78e0: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
78f0: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
7900: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
7910: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
7920: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
7930: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
7940: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
7950: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
7960: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
7970: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7980: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
7990: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
79a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
79b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
79c0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
79d0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  ster = 0;.    rc
79e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
79f0: 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46  Directory(zMainF
7a00: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ile);.    if( rc
7a10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7a20: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
7a30: 6e 6f 74 20 67 6f 6f 64 2e 20 54 68 65 20 6d 61  not good. The ma
7a40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
7a50: 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  e has been delet
7a60: 65 64 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  ed, but.      **
7a70: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
7a80: 79 6e 63 20 66 61 69 6c 65 64 2e 20 54 68 65 72  ync failed. Ther
7a90: 65 20 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 74 65  e is no complete
7aa0: 6c 79 20 73 61 66 65 20 63 6f 75 72 73 65 20 6f  ly safe course o
7ab0: 66 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 6f  f.      ** actio
7ac0: 6e 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 65  n from here. The
7ad0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
7ae0: 6e 61 6c 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  nals contain the
7af0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   name of the.   
7b00: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
7b10: 72 6e 61 6c 20 66 69 6c 65 2c 20 62 75 74 20 74  rnal file, but t
7b20: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 6f  here is no way o
7b30: 66 20 6b 6e 6f 77 69 6e 67 20 69 66 20 74 68 61  f knowing if tha
7b40: 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65  t.      ** maste
7b50: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
7b60: 20 6e 6f 77 20 6f 72 20 69 66 20 69 74 20 77 69   now or if it wi
7b70: 6c 6c 20 65 78 69 73 74 20 61 66 74 65 72 20 74  ll exist after t
7b80: 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 20  he operating.   
7b90: 20 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61     ** system cra
7ba0: 73 68 20 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c  sh that may foll
7bb0: 6f 77 20 74 68 65 20 66 73 79 6e 63 28 29 20 66  ow the fsync() f
7bc0: 61 69 6c 75 72 65 2e 0a 20 20 20 20 20 20 2a 2f  ailure..      */
7bd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
7be0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7bf0: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
7c00: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
7c10: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
7c20: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
7c30: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
7c40: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
7c50: 65 43 6f 6d 6d 69 74 28 29 20 61 72 65 20 6f 6e  eCommit() are on
7c60: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
7c70: 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 0a 20 20   and deleting.  
7c80: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20 49    ** journals. I
7c90: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
7ca0: 20 77 72 6f 6e 67 20 77 68 69 6c 65 20 74 68 69   wrong while thi
7cb0: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
7cc0: 65 20 64 6f 6e 27 74 0a 20 20 20 20 2a 2a 20 72  e don't.    ** r
7cd0: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
7ce0: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
7cf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7d00: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
7d10: 65 64 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 73  ed,.    ** but s
7d20: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
7d30: 20 6a 6f 75 72 6e 61 6c 73 20 6d 61 79 20 62 65   journals may be
7d40: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
7d50: 65 74 75 72 6e 69 6e 67 20 61 6e 0a 20 20 20 20  eturning an.    
7d60: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  ** error code wo
7d70: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
7d80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
7d90: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
7da0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
7db0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
7dc0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
7dd0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
7de0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
7df0: 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
7e00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7e10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7e20: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72 79  /*.** Find every
7e30: 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65 72   active VM other
7e40: 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64 20   than pVdbe and 
7e50: 63 68 61 6e 67 65 20 69 74 73 20 73 74 61 74 75  change its statu
7e60: 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64 2e  s to.** aborted.
7e70: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
7e80: 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73 65  hen one VM cause
7e90: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75 65  s a rollback due
7ea0: 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e   to an.** ON CON
7eb0: 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20 63  FLICT ROLLBACK c
7ec0: 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d 70  lause (for examp
7ed0: 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72 20  le).  The other 
7ee0: 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61  VMs must be.** a
7ef0: 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20 74  borted so that t
7f00: 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hey do not have 
7f10: 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74 20  data rolled out 
7f20: 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68 0a  from underneath.
7f30: 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67 20  ** them leading 
7f40: 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a 2a  to a segfault..*
7f50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62  /.static void ab
7f60: 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64  ortOtherActiveVd
7f70: 62 65 73 28 56 64 62 65 20 2a 70 56 64 62 65 29  bes(Vdbe *pVdbe)
7f80: 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72  {.  Vdbe *pOther
7f90: 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 70  ;.  for(pOther=p
7fa0: 56 64 62 65 2d 3e 64 62 2d 3e 70 56 64 62 65 3b  Vdbe->db->pVdbe;
7fb0: 20 70 4f 74 68 65 72 3b 20 70 4f 74 68 65 72 3d   pOther; pOther=
7fc0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pOther->pNext){.
7fd0: 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 3d 3d      if( pOther==
7fe0: 70 56 64 62 65 20 29 20 63 6f 6e 74 69 6e 75 65  pVdbe ) continue
7ff0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72  ;.    if( pOther
8000: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
8010: 47 49 43 5f 52 55 4e 20 7c 7c 20 70 4f 74 68 65  GIC_RUN || pOthe
8020: 72 2d 3e 70 63 3c 30 20 29 20 63 6f 6e 74 69 6e  r->pc<0 ) contin
8030: 75 65 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c  ue;.    closeAll
8040: 43 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29 3b  Cursors(pOther);
8050: 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 61 62 6f  .    pOther->abo
8060: 72 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  rted = 1;.  }.}.
8070: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
8080: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
8090: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
80a0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
80b0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
80c0: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
80d0: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
80e0: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
80f0: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
8100: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
8110: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
8120: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
8130: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
8140: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
8150: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
8160: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
8170: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
8180: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
8190: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
81a0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
81b0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
81c0: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
81d0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
81e0: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
81f0: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
8200: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
8210: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
8220: 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
8230: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
8240: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
8250: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
8260: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
8270: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
8280: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
8290: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
82a0: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
82b0: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
82c0: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
82d0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
82e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
82f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8300: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
8310: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
8320: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
8330: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
8340: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
8350: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
8360: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
8370: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
8380: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
8390: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
83a0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
83b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
83c0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
83d0: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
83e0: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
83f0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
8400: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
8410: 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20  GIC_HALT..**.** 
8420: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
8430: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
8440: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
8450: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
8460: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
8470: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
8480: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
8490: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
84a0: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
84b0: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
84c0: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
84d0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
84e0: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
84f0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
8500: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
8510: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
8520: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a   int i;.  int (*
8530: 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42  xFunc)(Btree *pB
8540: 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63  t) = 0;  /* Func
8550: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20  tion to call on 
8560: 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65  each btree backe
8570: 6e 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  nd */..  if( p->
8580: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
8590: 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  C_RUN ){.    /* 
85a0: 41 6c 72 65 61 64 79 20 68 61 6c 74 65 64 2e 20  Already halted. 
85b0: 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20   Nothing to do. 
85c0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
85d0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
85e0: 47 49 43 5f 48 41 4c 54 20 29 3b 0a 20 20 20 20  GIC_HALT );.    
85f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8600: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
8610: 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68  Cursors(p);.  ch
8620: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
8630: 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  (db);.  if( p->p
8640: 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  c<0 ){.    /* No
8650: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
8660: 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
8670: 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
8680: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 7d 65 6c  started */.  }el
8690: 73 65 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  se if( db->autoC
86a0: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63 74  ommit && db->act
86b0: 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b  iveVdbeCnt==1 ){
86c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
86d0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
86e0: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
86f0: 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Fail ){.      /*
8700: 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
8710: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
8720: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
8730: 72 20 61 63 74 69 76 65 20 71 75 65 72 69 65 73  r active queries
8740: 0a 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  .      ** using 
8750: 74 68 69 73 20 68 61 6e 64 6c 65 20 61 6e 64 20  this handle and 
8760: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
8770: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
8780: 6f 72 20 68 69 74 20 61 6e 0a 20 20 20 20 20 20  or hit an.      
8790: 2a 2a 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  ** 'OR FAIL' con
87a0: 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65  straint. This me
87b0: 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 69 73 20  ans a commit is 
87c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
87d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  */.      int rc 
87e0: 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29  = vdbeCommit(db)
87f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
8800: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
8810: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8820: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
8830: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
8840: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8850: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
8860: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
8870: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
8880: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
8890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78    }else{.      x
88a0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
88b0: 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20  reeRollback;.   
88c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
88d0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
88e0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
88f0: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
8900: 29 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d  ){.      xFunc =
8910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8920: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c  mitStmt;.    }el
8930: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
8940: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
8950: 29 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d  ){.      xFunc =
8960: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
8970: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 7d  lbackStmt;.    }
8980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 46 75 6e  else{.      xFun
8990: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
89a0: 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  Rollback;.      
89b0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
89c0: 20 31 3b 0a 20 20 20 20 20 20 61 62 6f 72 74 4f   1;.      abortO
89d0: 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28  therActiveVdbes(
89e0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
89f0: 20 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20   /* If xFunc is 
8a00: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
8a10: 74 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69  t is one of sqli
8a20: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
8a30: 2c 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74  ,.  ** sqlite3Bt
8a40: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20  reeRollbackStmt 
8a50: 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  or sqlite3BtreeC
8a60: 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20  ommitStmt. Call 
8a70: 69 74 20 6f 6e 63 65 20 6f 6e 0a 20 20 2a 2a 20  it once on.  ** 
8a80: 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66  each backend. If
8a90: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8aa0: 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
8ab0: 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 0a 20 20  code is still.  
8ac0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65  ** SQLITE_OK, se
8ad0: 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
8ae0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 65 72 72  e to the new err
8af0: 6f 72 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  or value..  */. 
8b00: 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20   for(i=0; xFunc 
8b10: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
8b20: 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 3b  +){ .    int rc;
8b30: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
8b40: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
8b50: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b  ;.    if( pBt ){
8b60: 0a 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e  .      rc = xFun
8b70: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  c(pBt);.      if
8b80: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8b90: 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b  OK ) p->rc = rc;
8ba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8bb0: 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
8bc0: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
8bd0: 72 20 44 45 4c 45 54 45 2c 20 73 65 74 20 74 68  r DELETE, set th
8be0: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
8bf0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 63 68  . */.  if( p->ch
8c00: 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e  angeCntOn && p->
8c10: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
8c20: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
8c30: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
8c40: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
8c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8c60: 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
8c70: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 65 6c  Change);.    }el
8c80: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8c90: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
8ca0: 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  db, 0);.    }.  
8cb0: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
8cc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  ;.  }..  /* Roll
8cd0: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
8ce0: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
8cf0: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
8d00: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 21   */.  if( p->rc!
8d10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8d20: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
8d30: 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  kInternalChanges
8d40: 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  (db);.  }else if
8d50: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
8d60: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
8d70: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
8d80: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
8d90: 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a  hanges(db);.  }.
8da0: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
8db0: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
8dc0: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
8dd0: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
8de0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
8df0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
8e00: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
8e10: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
8e20: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
8e30: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
8e40: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
8e50: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
8e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8e70: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
8e80: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
8e90: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
8ea0: 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
8eb0: 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
8ec0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
8ed0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
8ee0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
8ef0: 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
8f00: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
8f10: 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
8f20: 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
8f30: 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
8f40: 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
8f50: 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
8f60: 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
8f70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
8f80: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
8f90: 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
8fa0: 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
8fb0: 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
8fc0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
8fd0: 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
8fe0: 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
8ff0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
9000: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
9010: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
9020: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
9030: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
9040: 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 73 71  C_HALT ){.    sq
9050: 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62  lite3Error(p->db
9060: 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  , SQLITE_MISUSE,
9070: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9080: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
9090: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
90a0: 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
90b0: 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
90c0: 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
90d0: 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
90e0: 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
90f0: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
9100: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
9110: 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
9120: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
9130: 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
9140: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
9150: 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
9160: 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
9170: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
9180: 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
9190: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
91a0: 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
91b0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
91c0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
91d0: 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
91e0: 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
91f0: 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
9200: 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
9210: 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
9220: 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
9230: 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
9240: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
9250: 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
9260: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
9270: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
9280: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
9290: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
92a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e  sqlite3Error(p->
92b0: 64 62 2c 20 70 2d 3e 72 63 2c 20 22 25 73 22 2c  db, p->rc, "%s",
92c0: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
92d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
92e0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
92f0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
9300: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9310: 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73  p->rc ){.      s
9320: 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64  qlite3Error(p->d
9330: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
9340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
9350: 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64  qlite3Error(p->d
9360: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
9370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
9380: 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
9390: 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
93a0: 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
93b0: 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
93c0: 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
93d0: 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
93e0: 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
93f0: 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
9400: 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
9410: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
9420: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
9430: 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
9440: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
9450: 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
9460: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
9470: 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e  Error(p->db, p->
9480: 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rc, 0);.  }..  /
9490: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
94a0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
94b0: 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
94c0: 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
94d0: 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
94e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
94f0: 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
9500: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9510: 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b  pTos<&p->aStack[
9520: 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d  p->pc<0?0:p->pc]
9530: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
9540: 6f 63 5f 66 61 69 6c 65 64 3d 3d 31 20 29 3b 0a  oc_failed==1 );.
9550: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
9560: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
9570: 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
9580: 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
9590: 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
95a0: 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
95b0: 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
95c0: 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
95d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
95e0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
95f0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
9600: 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
9610: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
9620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
9630: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
9640: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9650: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
9660: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
9670: 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c  (out, "%6d %10ll
9680: 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20  d %8lld ",.     
9690: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
96a0: 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
96b0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
96c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
96d0: 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
96e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
96f0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
9700: 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
9710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9720: 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
9730: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
9740: 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
9750: 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
9760: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61  }.#endif.  p->ma
9770: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
9780: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72  _INIT;.  p->abor
9790: 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ted = 0;.  if( p
97a0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48  ->rc==SQLITE_SCH
97b0: 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EMA ){.    sqlit
97c0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
97d0: 63 68 65 6d 61 28 70 2d 3e 64 62 2c 20 30 29 3b  chema(p->db, 0);
97e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
97f0: 3e 72 63 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  >rc;.}. ./*.** C
9800: 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
9810: 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
9820: 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
9830: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
9840: 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
9850: 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
9860: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
9870: 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
9880: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
9890: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
98a0: 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
98b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
98c0: 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61  OK;..  if( p->ma
98d0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
98e0: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
98f0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
9900: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9910: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
9920: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
9930: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
9940: 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72  IC_INIT ){.    r
9950: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
9960: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
9970: 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
9980: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9990: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
99a0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
99b0: 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
99c0: 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
99d0: 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
99e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
99f0: 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
9a00: 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
9a10: 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
9a20: 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
9a30: 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
9a40: 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
9a50: 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
9a60: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
9a70: 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
9a80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
9a90: 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
9aa0: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
9ab0: 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
9ac0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
9ad0: 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
9ae0: 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
9af0: 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
9b00: 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
9b10: 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
9b20: 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
9b30: 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70  sk&(1<<i))) && p
9b40: 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
9b50: 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
9b60: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
9b70: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
9b80: 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
9b90: 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
9ba0: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
9bb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
9bc0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
9bd0: 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
9be0: 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
9bf0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
9c00: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
9c10: 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70  urn;.  Cleanup(p
9c20: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
9c30: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
9c40: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
9c50: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
9c60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
9c70: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
9c80: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20   p->db->pVdbe = 
9c90: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
9ca0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
9cb0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
9cc0: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
9cd0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70    }.  if( p->aOp
9ce0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
9cf0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
9d00: 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  .      Op *pOp =
9d10: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
9d20: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 74 79     if( pOp->p3ty
9d30: 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c  pe==P3_DYNAMIC |
9d40: 7c 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50  | pOp->p3type==P
9d50: 33 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  3_KEYINFO ){.   
9d60: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
9d70: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  pOp->p3);.      
9d80: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  }.      if( pOp-
9d90: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 56 44 42 45  >p3type==P3_VDBE
9da0: 46 55 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  FUNC ){.        
9db0: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
9dc0: 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20  unc = (VdbeFunc 
9dd0: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
9de0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
9df0: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
9e00: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
9e10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 56     sqliteFree(pV
9e20: 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  dbeFunc);.      
9e30: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  }.      if( pOp-
9e40: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 4d 45 4d 20  >p3type==P3_MEM 
9e50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9e60: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
9e70: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 4f 70 2d  ite3_value*)pOp-
9e80: 3e 70 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >p3);.      }.  
9e90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
9ea0: 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a  ee(p->aOp);.  }.
9eb0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
9ec0: 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
9ed0: 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ar);.  sqliteFre
9ee0: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
9ef0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53  sqliteFree(p->aS
9f00: 74 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  tack);.  release
9f10: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
9f20: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
9f30: 75 6d 6e 2a 32 29 3b 0a 20 20 73 71 6c 69 74 65  umn*2);.  sqlite
9f40: 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  Free(p->aColName
9f50: 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  );.  p->magic = 
9f60: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
9f70: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
9f80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
9f90: 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
9fa0: 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
9fb0: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
9fc0: 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
9fd0: 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65   MoveTo now.  Re
9fe0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
9ff0: 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54  de.  If no MoveT
a000: 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68  o is pending, th
a010: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f  is.** routine do
a020: 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72  es nothing and r
a030: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
a040: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a050: 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
a060: 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  (Cursor *p){.  i
a070: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
a080: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
a090: 72 65 73 2c 20 72 63 3b 0a 20 20 20 20 65 78 74  res, rc;.    ext
a0a0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
a0b0: 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20  search_count;.  
a0c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 74    assert( p->int
a0d0: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
a0e0: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
a0f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
a100: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
a110: 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
a120: 74 6f 54 61 72 67 65 74 2c 20 26 72 65 73 29 3b  toTarget, &res);
a130: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a140: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
a150: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
a160: 72 73 6f 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e  rsor,(char*)&p->
a170: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20  movetoTarget,.  
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
a1a0: 6f 66 28 69 36 34 29 2c 26 72 65 73 29 3b 0a 20  of(i64),&res);. 
a1b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
a1c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
a1d0: 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20   *p->pIncrKey = 
a1e0: 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 65  0;.    p->lastRe
a1f0: 63 6e 6f 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70  cno = keyToInt(p
a200: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b  ->movetoTarget);
a210: 0a 20 20 20 20 70 2d 3e 72 65 63 6e 6f 49 73 56  .    p->recnoIsV
a220: 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20  alid = res==0;. 
a230: 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
a240: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a250: 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70  e3BtreeNext(p->p
a260: 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
a270: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
a280: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
a290: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
a2a0: 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70  h_count++;.    p
a2b0: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
a2c0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
a2d0: 68 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  heValid = 0;.  }
a2e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a2f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
a300: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
a310: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
a320: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
a330: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
a340: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
a350: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
a360: 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a  eSerialRead().**
a370: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
a380: 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
a390: 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74  e3VdbeSerialWrit
a3a0: 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  e().**.** encaps
a3b0: 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
a3c0: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
a3d0: 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
a3e0: 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
a3f0: 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
a400: 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
a410: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
a420: 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
a430: 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
a440: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
a450: 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
a460: 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
a470: 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
a480: 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
a490: 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
a4a0: 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
a4b0: 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
a4c0: 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
a4d0: 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
a4e0: 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
a4f0: 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
a500: 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
a510: 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
a520: 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
a530: 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
a540: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
a550: 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
a560: 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
a570: 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
a580: 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
a590: 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
a5a0: 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
a5b0: 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
a5c0: 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
a5d0: 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
a5e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a5f0: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
a600: 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
a610: 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
a620: 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
a630: 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
a640: 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
a650: 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
a660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
a670: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
a680: 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
a690: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
a6c0: 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
a6f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
a700: 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
a720: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
a730: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
a740: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
a750: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
a760: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
a770: 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
a7a0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
a7b0: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
a7d0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
a7e0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
a7f0: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
a800: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
a810: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
a820: 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
a850: 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 38  E float.**     8
a860: 2d 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  -11             
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a880: 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
a890: 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
a8a0: 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
a8b0: 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
a8c0: 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
a8d0: 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
a8e0: 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
a8f0: 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a       text.**.*/.
a900: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a910: 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
a920: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
a930: 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
a940: 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
a950: 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
a960: 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  em){.  int flags
a970: 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
a980: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
a990: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
a9a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
a9b0: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
a9c0: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
a9d0: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
a9e0: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
a9f0: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
aa00: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
aa10: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 31  E ((((i64)0x0001
aa20: 30 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  0000)<<32)-1).  
aa30: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
aa40: 69 3b 0a 20 20 20 20 75 36 34 20 75 20 3d 20 69  i;.    u64 u = i
aa50: 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20  <0 ? -i : i;.   
aa60: 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65   if( u<=127 ) re
aa70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
aa80: 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
aa90: 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
aaa0: 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
aab0: 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
aac0: 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
aad0: 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
aae0: 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
aaf0: 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
ab00: 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
ab10: 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
ab20: 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
ab30: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
ab40: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e  EM_Str ){.    in
ab50: 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  t n = pMem->n;. 
ab60: 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20     assert( n>=0 
ab70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
ab80: 6e 2a 32 29 20 2b 20 31 33 29 3b 0a 20 20 7d 0a  n*2) + 13);.  }.
ab90: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
aba0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72 65 74 75  Blob ){.    retu
abb0: 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20  rn (pMem->n*2 + 
abc0: 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  12);.  }.  retur
abd0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
abe0: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
abf0: 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
ac00: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
ac10: 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
ac20: 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -type..*/.int sq
ac30: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
ac40: 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
ac50: 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
ac60: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
ac70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
ac80: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
ac90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
aca0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
acb0: 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
acc0: 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
acd0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
ace0: 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
acf0: 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
ad00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74   }.}../*.** Writ
ad10: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
ad20: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
ad30: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
ad40: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
ad50: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
ad60: 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
ad70: 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
ad80: 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
ad90: 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
ada0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
adb0: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69  s written..*/ .i
adc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
add0: 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65 64  rialPut(unsigned
ade0: 20 63 68 61 72 20 2a 62 75 66 2c 20 4d 65 6d 20   char *buf, Mem 
adf0: 2a 70 4d 65 6d 29 7b 0a 20 20 75 33 32 20 73 65  *pMem){.  u32 se
ae00: 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
ae10: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
ae20: 65 28 70 4d 65 6d 29 3b 0a 20 20 69 6e 74 20 6c  e(pMem);.  int l
ae30: 65 6e 3b 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 2a  en;..  /* NULL *
ae40: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
ae50: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ype==0 ){.    re
ae60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 0a 20 20  turn 0;.  }. .  
ae70: 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
ae80: 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
ae90: 69 61 6c 5f 74 79 70 65 3c 3d 37 20 29 7b 0a 20  ial_type<=7 ){. 
aea0: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
aeb0: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
aec0: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
aed0: 20 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29       v = *(u64*)
aee0: 26 70 4d 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65  &pMem->r;.    }e
aef0: 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a  lse{.      v = *
af00: 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a  (u64*)&pMem->i;.
af10: 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
af20: 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
af30: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
af40: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 77  ial_type);.    w
af50: 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20  hile( i-- ){.   
af60: 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30     buf[i] = (v&0
af70: 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
af80: 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
af90: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 20  eturn len;.  }. 
afa0: 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72   .  /* String or
afb0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73 65 72   blob */.  asser
afc0: 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  t( serial_type>=
afd0: 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  12 );.  len = sq
afe0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
aff0: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
b000: 70 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 62 75  pe);.  memcpy(bu
b010: 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
b020: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a  ;.  return len;.
b030: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
b040: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
b050: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
b060: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
b070: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
b080: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
b090: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
b0a0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
b0b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
b0c0: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
b0d0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
b0e0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
b0f0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
b100: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
b110: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
b120: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
b130: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
b140: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
b150: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
b160: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
b190: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
b1a0: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e   into */.){.  in
b1b0: 74 20 6c 65 6e 3b 0a 0a 20 20 69 66 28 20 73 65  t len;..  if( se
b1c0: 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
b1d0: 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20      /* NULL */. 
b1e0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
b1f0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 72   MEM_Null;.    r
b200: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6c  eturn 0;.  }.  l
b210: 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  en = sqlite3Vdbe
b220: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
b230: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
b240: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
b250: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 74 65 67   ){.    /* Integ
b260: 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
b270: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
b280: 70 65 3c 3d 34 20 29 7b 0a 20 20 20 20 20 20 2f  pe<=4 ){.      /
b290: 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  * 32-bit integer
b2a0: 20 74 79 70 65 2e 20 20 54 68 69 73 20 69 73 20   type.  This is 
b2b0: 68 61 6e 64 6c 65 64 20 62 79 20 61 20 73 70 65  handled by a spe
b2c0: 63 69 61 6c 20 63 61 73 65 20 66 6f 72 0a 20 20  cial case for.  
b2d0: 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e      ** performan
b2e0: 63 65 20 72 65 61 73 6f 6e 73 2e 20 2a 2f 0a 20  ce reasons. */. 
b2f0: 20 20 20 20 20 69 6e 74 20 76 20 3d 20 62 75 66       int v = buf
b300: 5b 30 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  [0];.      int n
b310: 3b 0a 20 20 20 20 20 20 69 66 28 20 76 26 30 78  ;.      if( v&0x
b320: 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20  80 ){.        v 
b330: 7c 3d 20 2d 32 35 36 3b 0a 20 20 20 20 20 20 7d  |= -256;.      }
b340: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  .      for(n=1; 
b350: 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20  n<len; n++){.   
b360: 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 38 29 20       v = (v<<8) 
b370: 7c 20 62 75 66 5b 6e 5d 3b 0a 20 20 20 20 20 20  | buf[n];.      
b380: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
b390: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
b3a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 76       pMem->i = v
b3b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  ;.      return n
b3c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b3d0: 20 20 20 75 36 34 20 76 20 3d 20 30 3b 0a 20 20     u64 v = 0;.  
b3e0: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
b3f0: 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38    if( buf[0]&0x8
b400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  0 ){.        v =
b410: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
b420: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6c 65     for(n=0; n<le
b430: 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; n++){.       
b440: 20 76 20 3d 20 28 76 3c 3c 38 29 20 7c 20 62 75   v = (v<<8) | bu
b450: 66 5b 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f[n];.      }.  
b460: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
b470: 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
b480: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b490: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
b4a0: 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f    pMem->r = *(do
b4b0: 75 62 6c 65 2a 29 26 76 3b 0a 20 20 20 20 20 20  uble*)&v;.      
b4c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
b4d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
b4e0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  _Int;.        pM
b4f0: 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26  em->i = *(i64*)&
b500: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  v;.      }.    }
b510: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
b520: 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
b530: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
b540: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
b550: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
b560: 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
b570: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a   pMem->n = len;.
b580: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
b590: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   0;.    if( seri
b5a0: 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a  al_type&0x01 ){.
b5b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b5c0: 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
b5d0: 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d 65 6c  M_Ephem;.    }el
b5e0: 73 65 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  se{.      pMem->
b5f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
b600: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
b610: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
b620: 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   len;.}../*.** T
b630: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
b640: 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
b650: 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
b660: 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66  x records specif
b670: 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79  ied by .** {nKey
b680: 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e  1, pKey1} and {n
b690: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65  Key2, pKey2}, re
b6a0: 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69  turning a negati
b6b0: 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
b6c0: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
b6d0: 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
b6e0: 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
b6f0: 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
b700: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b  greater than {nK
b710: 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f  ey2, pKey2}.  Bo
b720: 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  th Key1 and Key2
b730: 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74   must be byte st
b740: 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65  rings.** compose
b750: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
b760: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
b770: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e   the VDBE..*/.in
b780: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
b790: 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  ordCompare(.  vo
b7a0: 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20  id *userData,.  
b7b0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
b7c0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
b7d0: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
b7e0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
b7f0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
b800: 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a  Info = (KeyInfo*
b810: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32  )userData;.  u32
b820: 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20   d1, d2;        
b830: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
b840: 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
b850: 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
b860: 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32    u32 idx1, idx2
b870: 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  ;      /* Offset
b880: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
b890: 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
b8a0: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
b8b0: 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a  dr1, szHdr2;  /*
b8c0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
b8d0: 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
b8e0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
b8f0: 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
b900: 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
b910: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
b920: 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
b930: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
b940: 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  y1;.  const unsi
b950: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32  gned char *aKey2
b960: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
b970: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b  ed char *)pKey2;
b980: 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20  ..  Mem mem1;.  
b990: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31  Mem mem2;.  mem1
b9a0: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
b9b0: 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63  >enc;.  mem2.enc
b9c0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
b9d0: 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 73 71  ;.  .  idx1 = sq
b9e0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
b9f0: 28 70 4b 65 79 31 2c 20 26 73 7a 48 64 72 31 29  (pKey1, &szHdr1)
ba00: 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
ba10: 0a 20 20 69 64 78 32 20 3d 20 73 71 6c 69 74 65  .  idx2 = sqlite
ba20: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b 65  3GetVarint32(pKe
ba30: 79 32 2c 20 26 73 7a 48 64 72 32 29 3b 0a 20 20  y2, &szHdr2);.  
ba40: 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e  d2 = szHdr2;.  n
ba50: 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
ba60: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
ba70: 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
ba80: 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b  & idx2<szHdr2 ){
ba90: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
baa0: 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73  type1;.    u32 s
bab0: 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20  erial_type2;..  
bac0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
bad0: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
bae0: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
baf0: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
bb00: 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
bb10: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  te3GetVarint32(&
bb20: 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 26 73 65  aKey1[idx1], &se
bb30: 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20  rial_type1);.   
bb40: 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
bb50: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
bb60: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
bb70: 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
bb80: 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20  ak;.    idx2 += 
bb90: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
bba0: 33 32 28 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c  32(&aKey2[idx2],
bbb0: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3b   &serial_type2);
bbc0: 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65  .    if( d2>=nKe
bbd0: 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y2 && sqlite3Vdb
bbe0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
bbf0: 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29  erial_type2)>0 )
bc00: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
bc10: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 72  Assert that ther
bc20: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
bc30: 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68 20 6b  e left in each k
bc40: 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20  ey for the blob 
bc50: 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 74  of.    ** data t
bc60: 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20 73 65  o go with the se
bc70: 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74 20 72  rial type just r
bc80: 65 61 64 2e 20 54 68 69 73 20 61 73 73 65 72 74  ead. This assert
bc90: 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 20 20   may fail if.   
bca0: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20   ** the file is 
bcb0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 6e  corrupted.  Then
bcc0: 20 72 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   read the value 
bcd0: 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 69 6e  from each key in
bce0: 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61  to mem1.    ** a
bcf0: 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63 74 69  nd mem2 respecti
bd00: 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vely..    */.   
bd10: 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
bd20: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
bd30: 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
bd40: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
bd50: 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56    d2 += sqlite3V
bd60: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
bd70: 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f  ey2[d2], serial_
bd80: 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a  type2, &mem2);..
bd90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bda0: 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
bdb0: 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c  , &mem2, i<nFiel
bdc0: 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
bdd0: 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
bde0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
bdf0: 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20  elease(&mem1);. 
be00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
be10: 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b  mRelease(&mem2);
be20: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
be30: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
be40: 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
be50: 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  }..  /* One of t
be60: 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
be70: 6f 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61  of fields, but a
be80: 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
be90: 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20   to that point. 
bea0: 20 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20   ** were equal. 
beb0: 49 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66  If the incrKey f
bec0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
bed0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79  n the second key
bee0: 20 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64   is.  ** treated
bef0: 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f   as larger..  */
bf00: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
bf10: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
bf20: 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20  ->incrKey ){.   
bf30: 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
bf40: 7d 65 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65  }else if( d1<nKe
bf50: 79 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  y1 ){.      rc =
bf60: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
bf70: 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20  ( d2<nKey2 ){.  
bf80: 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
bf90: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4b   }.  }..  if( pK
bfa0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
bfb0: 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f  er && i<pKeyInfo
bfc0: 2d 3e 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79  ->nField && pKey
bfd0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
bfe0: 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [i] ){.    rc = 
bff0: 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -rc;.  }..  retu
c000: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c010: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
c020: 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
c030: 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68  omposed using th
c040: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
c050: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c  opcode..** The l
c060: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ast entry in thi
c070: 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  s record should 
c080: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73  be an integer (s
c090: 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61  pecifically.** a
c0a0: 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29  n integer rowid)
c0b0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c0c0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
c0d0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a  er of bytes in.*
c0e0: 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a  * that integer..
c0f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c100: 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 69 6e  beIdxRowidLen(in
c110: 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38  t nKey, const u8
c120: 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73   *aKey){.  u32 s
c130: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
c140: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
c150: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
c160: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
c170: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
c180: 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69  rowid */..  sqli
c190: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61  te3GetVarint32(a
c1a0: 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  Key, &szHdr);.  
c1b0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
c1c0: 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31  32(&aKey[szHdr-1
c1d0: 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
c1e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
c1f0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
c200: 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a  n(typeRowid);.}.
c210: 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70    ../*.** pCur p
c220: 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
c230: 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
c240: 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
c250: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
c260: 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
c270: 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
c280: 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
c290: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
c2a0: 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
c2b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
c2c0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
c2d0: 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
c2e0: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
c2f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
c300: 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f  IdxRowid(BtCurso
c310: 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
c320: 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
c330: 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lKey;.  int rc;.
c340: 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
c350: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
c360: 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
c370: 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
c380: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
c390: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
c3a0: 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
c3b0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
c3c0: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
c3d0: 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74  m m, v;..  sqlit
c3e0: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
c3f0: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
c400: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
c410: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c420: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
c430: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
c440: 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
c450: 72 65 65 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  ree(pCur, 0, nCe
c460: 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
c470: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
c480: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
c490: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
c4a0: 33 32 28 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b  32(m.z, &szHdr);
c4b0: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
c4c0: 69 6e 74 33 32 28 26 6d 2e 7a 5b 73 7a 48 64 72  int32(&m.z[szHdr
c4d0: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
c4e0: 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  ;.  lenRowid = s
c4f0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
c500: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
c510: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
c520: 65 53 65 72 69 61 6c 47 65 74 28 26 6d 2e 7a 5b  eSerialGet(&m.z[
c530: 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
c540: 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
c550: 20 2a 72 6f 77 69 64 20 3d 20 76 2e 69 3b 0a 20   *rowid = v.i;. 
c560: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
c570: 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
c580: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c590: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
c5a0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
c5b0: 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
c5c0: 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
c5d0: 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  int to against.*
c5e0: 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
c5f0: 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e   in pKey (of len
c600: 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74  gth nKey).  Writ
c610: 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
c620: 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
c630: 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
c640: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
c650: 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
c660: 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
c670: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b   greater than pK
c680: 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ey.  Return SQLI
c690: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
c6a0: 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20  ..**.** pKey is 
c6b0: 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
c6c0: 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
c6d0: 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
c6e0: 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
c6f0: 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
c700: 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
c710: 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
c720: 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
c730: 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
c740: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20  as well..*/.int 
c750: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
c760: 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73  yCompare(.  Curs
c770: 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
c780: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
c790: 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
c7a0: 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e   against */.  in
c7b0: 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38  t nKey, const u8
c7c0: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
c7d0: 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
c7e0: 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
c810: 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
c820: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
c830: 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74   nCellKey;.  int
c840: 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
c850: 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
c860: 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f  sor;.  int lenRo
c870: 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  wid;.  Mem m;.. 
c880: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
c890: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
c8a0: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
c8b0: 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
c8c0: 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
c8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c8e0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
c8f0: 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
c900: 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
c910: 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
c920: 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
c930: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
c940: 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
c950: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
c960: 6f 77 69 64 4c 65 6e 28 6d 2e 6e 2c 20 6d 2e 7a  owidLen(m.n, m.z
c970: 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
c980: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
c990: 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66  pare(pC->pKeyInf
c9a0: 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c  o, m.n-lenRowid,
c9b0: 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79   m.z, nKey, pKey
c9c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c9d0: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
c9e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c9f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
ca00: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
ca10: 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
ca20: 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
ca30: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
ca40: 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
ca50: 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
ca60: 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
ca70: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
ca80: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
ca90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
caa0: 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 64 62 2d   nChange){.  db-
cab0: 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
cac0: 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
cad0: 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
cae0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
caf0: 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
cb00: 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
cb10: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
cb20: 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
cb30: 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
cb40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cb50: 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
cb60: 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
cb70: 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
cb80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
cb90: 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
cba0: 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
cbb0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
cbc0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
cbd0: 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
cbe0: 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
cbf0: 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
cc00: 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
cc10: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
cc20: 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
cc30: 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
cc40: 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
cc50: 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
cc60: 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
cc70: 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
cc80: 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
cc90: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
cca0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
ccb0: 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
ccc0: 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
ccd0: 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
cce0: 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
ccf0: 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
cd00: 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
cd10: 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
cd20: 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
cd30: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
cd40: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
cd50: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
cd60: 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
cd70: 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
cd80: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
cd90: 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
cda0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
cdb0: 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
cdc0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
cdd0: 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
cde0: 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
cdf0: 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
ce00: 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.