/ Hex Artifact Content
Login

Artifact daf40a292ec458ed962845a8d95d5c96bc242e04:


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 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  e *db){.  Vdbe *
0450: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 4d  p;.  p = sqliteM
0460: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 56 64  alloc( sizeof(Vd
0470: 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  be) );.  if( p==
0480: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0490: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66  p->db = db;.  if
04a0: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
04b0: 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50     db->pVdbe->pP
04c0: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70  rev = p;.  }.  p
04d0: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56  ->pNext = db->pV
04e0: 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  dbe;.  p->pPrev 
04f0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65  = 0;.  db->pVdbe
0500: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = p;.  p->magic
0510: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
0520: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  IT;.  return p;.
0530: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  }../*.** Turn tr
0540: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0550: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0560: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0570: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0580: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0590: 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ce;.}../*.** Add
05a0: 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69   a new instructi
05b0: 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  on to the list o
05c0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63  f instructions c
05d0: 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a  urrent in the.**
05e0: 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74   VDBE.  Return t
05f0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
0600: 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  e new instructio
0610: 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  n..**.** Paramet
0620: 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20  ers:.**.**    p 
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f                Po
0640: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42  inter to the VDB
0650: 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20  E.**.**    op   
0660: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f             The o
0670: 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69  pcode for this i
0680: 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a  nstruction.**.**
0690: 20 20 20 20 70 31 2c 20 70 32 20 20 20 20 20 20      p1, p2      
06a0: 20 20 20 20 46 69 72 73 74 20 74 77 6f 20 6f 66      First two of
06b0: 20 74 68 65 20 74 68 72 65 65 20 70 6f 73 73 69   the three possi
06c0: 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a  ble operands..**
06d0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
06e0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
06f0: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0700: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0710: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0720: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
0730: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0740: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0750: 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72  f the P3.** oper
0760: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0770: 74 65 33 56 64 62 65 41 64 64 4f 70 28 56 64 62  te3VdbeAddOp(Vdb
0780: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
0790: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
07a0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
07b0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
07c0: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  >nOp;.  p->nOp++
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
07e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
07f0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
0800: 3e 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b  >=p->nOpAlloc ){
0810: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65  .    int oldSize
0820: 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a   = p->nOpAlloc;.
0830: 20 20 20 20 4f 70 20 2a 61 4e 65 77 3b 0a 20 20      Op *aNew;.  
0840: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0850: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b 20  p->nOpAlloc*2 + 
0860: 31 30 30 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  100;.    aNew = 
0870: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d  sqliteRealloc(p-
0880: 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  >aOp, p->nOpAllo
0890: 63 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  c*sizeof(Op));. 
08a0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
08b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c  {.      p->nOpAl
08c0: 6c 6f 63 20 3d 20 6f 6c 64 53 69 7a 65 3b 0a 20  loc = oldSize;. 
08d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
08e0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4f 70 20     }.    p->aOp 
08f0: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 6d 65 6d 73  = aNew;.    mems
0900: 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69  et(&p->aOp[oldSi
0910: 7a 65 5d 2c 20 30 2c 20 28 70 2d 3e 6e 4f 70 41  ze], 0, (p->nOpA
0920: 6c 6c 6f 63 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  lloc-oldSize)*si
0930: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 7d 0a 20  zeof(Op));.  }. 
0940: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
0950: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ];.  pOp->opcode
0960: 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31   = op;.  pOp->p1
0970: 20 3d 20 70 31 3b 0a 20 20 69 66 28 20 70 32 3c   = p1;.  if( p2<
0980: 30 20 26 26 20 28 2d 31 2d 70 32 29 3c 70 2d 3e  0 && (-1-p2)<p->
0990: 6e 4c 61 62 65 6c 20 26 26 20 70 2d 3e 61 4c 61  nLabel && p->aLa
09a0: 62 65 6c 5b 2d 31 2d 70 32 5d 3e 3d 30 20 29 7b  bel[-1-p2]>=0 ){
09b0: 0a 20 20 20 20 70 32 20 3d 20 70 2d 3e 61 4c 61  .    p2 = p->aLa
09c0: 62 65 6c 5b 2d 31 2d 70 32 5d 3b 0a 20 20 7d 0a  bel[-1-p2];.  }.
09d0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a    pOp->p2 = p2;.
09e0: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
09f0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
0a00: 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64  3_NOTUSED;.#ifnd
0a10: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
0a20: 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64  sqlite3_vdbe_add
0a30: 6f 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69 74  op_trace ) sqlit
0a40: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
0a50: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
0a60: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
0a70: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   i;.}../*.** Add
0a80: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
0a90: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 33 20  includes the p3 
0aa0: 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  value..*/.int sq
0ab0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 56 64 62  lite3VdbeOp3(Vdb
0ac0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
0ad0: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f  t p1, int p2, co
0ae0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 69 6e  nst char *zP3,in
0af0: 74 20 70 33 74 79 70 65 29 7b 0a 20 20 69 6e 74  t p3type){.  int
0b00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
0b10: 64 62 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20  dbeAddOp(p, op, 
0b20: 70 31 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69 74  p1, p2);.  sqlit
0b30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 70  e3VdbeChangeP3(p
0b40: 2c 20 61 64 64 72 2c 20 7a 50 33 2c 20 70 33 74  , addr, zP3, p3t
0b50: 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ype);.  return a
0b60: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ddr;.}../*.** Cr
0b70: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
0b80: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e  lic label for an
0b90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
0ba0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a  t has yet to be.
0bb0: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73  ** coded.  The s
0bc0: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73  ymbolic label is
0bd0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e   really just a n
0be0: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20  egative number. 
0bf0: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61   The.** label ca
0c00: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  n be used as the
0c10: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20   P2 value of an 
0c20: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65  operation.  Late
0c30: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  r, when.** the l
0c40: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64  abel is resolved
0c50: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61   to a specific a
0c60: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45  ddress, the VDBE
0c70: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68   will scan.** th
0c80: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74  rough its operat
0c90: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61  ion list and cha
0ca0: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  nge all values o
0cb0: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68  f P2 which match
0cc0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e  .** the label in
0cd0: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20  to the resolved 
0ce0: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  address..**.** T
0cf0: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68  he VDBE knows th
0d00: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73  at a P2 value is
0d10: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65   a label because
0d20: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61   labels are.** a
0d30: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61  lways negative a
0d40: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65  nd P2 values are
0d50: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e   suppose to be n
0d60: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
0d70: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76  Hence, a negativ
0d80: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  e P2 value is a 
0d90: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79  label that has y
0da0: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65  et to be resolve
0db0: 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  d..**.** Zero is
0dc0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
0dd0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
0de0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0df0: 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20  eMakeLabel(Vdbe 
0e00: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
0e10: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
0e20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
0e30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
0e40: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e  INIT );.  if( i>
0e50: 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20  =p->nLabelAlloc 
0e60: 29 7b 0a 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  ){.    int *aNew
0e70: 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41  ;.    p->nLabelA
0e80: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  lloc = p->nLabel
0e90: 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20  Alloc*2 + 10;.  
0ea0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
0eb0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 61 62 65  ealloc( p->aLabe
0ec0: 6c 2c 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f  l, p->nLabelAllo
0ed0: 63 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  c*sizeof(p->aLab
0ee0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  el[0]));.    if(
0ef0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
0f00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
0f10: 61 4c 61 62 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  aLabel);.    }. 
0f20: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 61     p->aLabel = a
0f30: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
0f40: 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  ->aLabel==0 ){. 
0f50: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30     p->nLabel = 0
0f60: 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41  ;.    p->nLabelA
0f70: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 72 65  lloc = 0;.    re
0f80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  turn 0;.  }.  p-
0f90: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
0fa0: 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a  .  return -1-i;.
0fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
0fc0: 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65   label "x" to be
0fd0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0fe0: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
0ff0: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e  tion to.** be in
1000: 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72  serted.  The par
1010: 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20  ameter "x" must 
1020: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
1030: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69  ed from.** a pri
1040: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
1050: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1060: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1070: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1080: 65 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  el(Vdbe *p, int 
1090: 78 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  x){.  int j;.  a
10a0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
10b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
10c0: 20 29 3b 0a 20 20 69 66 28 20 78 3c 30 20 26 26   );.  if( x<0 &&
10d0: 20 28 2d 78 29 3c 3d 70 2d 3e 6e 4c 61 62 65 6c   (-x)<=p->nLabel
10e0: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
10f0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 5b    if( p->aLabel[
1100: 2d 31 2d 78 5d 3d 3d 70 2d 3e 6e 4f 70 20 29 20  -1-x]==p->nOp ) 
1110: 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65  return;.    asse
1120: 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31  rt( p->aLabel[-1
1130: 2d 78 5d 3c 30 20 29 3b 0a 20 20 20 20 70 2d 3e  -x]<0 );.    p->
1140: 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d 20 3d 20 70  aLabel[-1-x] = p
1150: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 66 6f 72 28 6a  ->nOp;.    for(j
1160: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4f 70 3b 20 6a 2b  =0; j<p->nOp; j+
1170: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1180: 3e 61 4f 70 5b 6a 5d 2e 70 32 3d 3d 78 20 29 20  >aOp[j].p2==x ) 
1190: 70 2d 3e 61 4f 70 5b 6a 5d 2e 70 32 20 3d 20 70  p->aOp[j].p2 = p
11a0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nOp;.    }.  }
11b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11c0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
11d0: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
11e0: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
11f0: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1200: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1210: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
1220: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1230: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1240: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
1250: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  nOp;.}../*.** Ad
1260: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
1270: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
1280: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
1290: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ack.  Return the
12a0: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
12b0: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
12c0: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74  on added..*/.int
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e0: 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69  pList(Vdbe *p, i
12f0: 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69  nt nOp, VdbeOpLi
1300: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a  st const *aOp){.
1310: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73    int addr;.  as
1320: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1330: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1340: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
1350: 2b 20 6e 4f 70 20 3e 3d 20 70 2d 3e 6e 4f 70 41  + nOp >= p->nOpA
1360: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
1370: 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70  oldSize = p->nOp
1380: 41 6c 6c 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61  Alloc;.    Op *a
1390: 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  New;.    p->nOpA
13a0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c  lloc = p->nOpAll
13b0: 6f 63 2a 32 20 2b 20 6e 4f 70 20 2b 20 31 30 3b  oc*2 + nOp + 10;
13c0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
13d0: 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70  teRealloc(p->aOp
13e0: 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69  , p->nOpAlloc*si
13f0: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 69  zeof(Op));.    i
1400: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
1410: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
1420: 3d 20 6f 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20  = oldSize;.     
1430: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1440: 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e  .    p->aOp = aN
1450: 65 77 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ew;.    memset(&
1460: 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c  p->aOp[oldSize],
1470: 20 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   0, (p->nOpAlloc
1480: 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66  -oldSize)*sizeof
1490: 28 4f 70 29 29 3b 0a 20 20 7d 0a 20 20 61 64 64  (Op));.  }.  add
14a0: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  r = p->nOp;.  if
14b0: 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69  ( nOp>0 ){.    i
14c0: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
14d0: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
14e0: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
14f0: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
1500: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
1510: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
1520: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
1530: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
1540: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
1550: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
1560: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
1570: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
1580: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  ;.      pOut->p2
1590: 20 3d 20 70 32 3c 30 20 3f 20 61 64 64 72 20 2b   = p2<0 ? addr +
15a0: 20 41 44 44 52 28 70 32 29 20 3a 20 70 32 3b 0a   ADDR(p2) : p2;.
15b0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d        pOut->p3 =
15c0: 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pIn->p3;.      
15d0: 70 4f 75 74 2d 3e 70 33 74 79 70 65 20 3d 20 70  pOut->p3type = p
15e0: 49 6e 2d 3e 70 33 20 3f 20 50 33 5f 53 54 41 54  In->p3 ? P3_STAT
15f0: 49 43 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b  IC : P3_NOTUSED;
1600: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1610: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1620: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
1630: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ce ){.        sq
1640: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
1650: 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e  (0, i+addr, &p->
1660: 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20  aOp[i+addr]);.  
1670: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1680: 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d   }.    p->nOp +=
1690: 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75   nOp;.  }.  retu
16a0: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
16b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
16c0: 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65  ue of the P1 ope
16d0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
16e0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
16f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1700: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
1710: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
1720: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
1730: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
1740: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
1750: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
1760: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1770: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
1780: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
1790: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
17a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17b0: 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P1(Vdbe *p, int 
17c0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
17d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
17e0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
17f0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
1800: 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e  & addr>=0 && p->
1810: 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61  nOp>addr && p->a
1820: 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  Op ){.    p->aOp
1830: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
1840: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
1850: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
1860: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
1870: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
1880: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
1890: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
18a0: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
18b0: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
18c0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
18d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18e0: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
18f0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
1900: 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30    assert( val>=0
1910: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1920: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1930: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
1940: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
1950: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
1960: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
1970: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
1980: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
1990: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
19a0: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
19b0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
19c0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
19d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19e0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
19f0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
1a00: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
1a10: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
1a20: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
1a30: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
1a40: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1a50: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
1a60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
1a70: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
1a80: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33  n>=0 then the P3
1a90: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
1aa0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
1ab0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
1ac0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
1ad0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
1ae0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1af0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  teMalloc()..** A
1b00: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
1b10: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
1b20: 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64  of zP3 up to and
1b30: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
1b40: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
1b50: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
1b60: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
1b70: 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP3..**.** If 
1b80: 6e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74  n==P3_STATIC  it
1b90: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20   means that zP3 
1ba0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1bb0: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
1bc0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
1bd0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
1be0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 20 6e   the pointer.  n
1bf0: 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 6d 65 61  ==P3_POINTER mea
1c00: 6e 73 20 7a 50 33 20 69 73 0a 2a 2a 20 61 20 70  ns zP3 is.** a p
1c10: 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 6f  ointer to some o
1c20: 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
1c30: 20 61 20 73 74 72 69 6e 67 2e 20 20 6e 3d 3d 50   a string.  n==P
1c40: 33 5f 43 4f 4c 4c 53 45 51 20 61 6e 64 0a 2a 2a  3_COLLSEQ and.**
1c50: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 6d   n==P3_KEYINFO m
1c60: 65 61 6e 20 74 68 61 74 20 7a 50 33 20 69 73 20  ean that zP3 is 
1c70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43  a pointer to a C
1c80: 6f 6c 6c 53 65 71 20 6f 72 20 4b 65 79 49 6e 66  ollSeq or KeyInf
1c90: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
1ca0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
1cb0: 6f 66 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  of KeyInfo struc
1cc0: 74 75 72 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72  tures into memor
1cd0: 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  y obtained.** fr
1ce0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e  om sqliteMalloc.
1cf0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
1d00: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 33 20   then change P3 
1d10: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
1d20: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
1d30: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
1d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
1d50: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
1d60: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
1d70: 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e  char *zP3, int n
1d80: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
1d90: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1da0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1db0: 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  T );.  if( p==0 
1dc0: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 20 72  || p->aOp==0 ) r
1dd0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 61 64 64  eturn;.  if( add
1de0: 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e  r<0 || addr>=p->
1df0: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64 64 72 20  nOp ){.    addr 
1e00: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
1e10: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72    if( addr<0 ) r
1e20: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70  eturn;.  }.  pOp
1e30: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
1e40: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20  ;.  if( pOp->p3 
1e50: 26 26 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d  && pOp->p3type==
1e60: 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P3_DYNAMIC ){.  
1e70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70    sqliteFree(pOp
1e80: 2d 3e 70 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  ->p3);.    pOp->
1e90: 70 33 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  p3 = 0;.  }.  if
1ea0: 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP3==0 ){.    
1eb0: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20  pOp->p3 = 0;.   
1ec0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
1ed0: 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  3_NOTUSED;.  }el
1ee0: 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59  se if( n==P3_KEY
1ef0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
1f00: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1f10: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e     int nField, n
1f20: 42 79 74 65 3b 0a 20 20 20 20 6e 46 69 65 6c 64  Byte;.    nField
1f30: 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50   = ((KeyInfo*)zP
1f40: 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20  3)->nField;.    
1f50: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
1f60: 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69  pKeyInfo) + (nFi
1f70: 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b  eld-1)*sizeof(pK
1f80: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
1f90: 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  );.    pKeyInfo 
1fa0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1fb0: 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  w( nByte );.    
1fc0: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
1fd0: 29 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  )pKeyInfo;.    i
1fe0: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
1ff0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
2000: 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42 79 74 65  Info, zP3, nByte
2010: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  );.      pOp->p3
2020: 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46  type = P3_KEYINF
2030: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
2040: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
2050: 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P3_NOTUSED;.  
2060: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2070: 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P3_KEYINFO_HA
2080: 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70  NDOFF ){.    pOp
2090: 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50  ->p3 = (char*)zP
20a0: 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79  3;.    pOp->p3ty
20b0: 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b  pe = P3_KEYINFO;
20c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30  .  }else if( n<0
20d0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   ){.    pOp->p3 
20e0: 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20  = (char*)zP3;.  
20f0: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
2100: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
2110: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
2120: 67 28 26 70 4f 70 2d 3e 70 33 2c 20 7a 50 33 2c  g(&pOp->p3, zP3,
2130: 20 6e 2c 20 30 29 3b 0a 20 20 20 20 70 4f 70 2d   n, 0);.    pOp-
2140: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59 4e  >p3type = P3_DYN
2150: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
2160: 2a 2a 20 49 66 20 74 68 65 20 50 33 20 6f 70 65  ** If the P3 ope
2170: 72 61 6e 64 20 74 6f 20 74 68 65 20 73 70 65 63  rand to the spec
2180: 69 66 69 65 64 20 69 6e 73 74 72 75 63 74 69 6f  ified instructio
2190: 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 74 6f 20  n appears.** to 
21a0: 62 65 20 61 20 71 75 6f 74 65 64 20 73 74 72 69  be a quoted stri
21b0: 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 6e 20 74  ng token, then t
21c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
21d0: 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 20 71 75  moves .** the qu
21e0: 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  otes..**.** The 
21f0: 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 74 6f 72  quoting operator
2200: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61   can be either a
2210: 20 67 72 61 76 65 20 61 73 63 65 6e 74 20 28 41   grave ascent (A
2220: 53 43 49 49 20 30 78 32 37 29 0a 2a 2a 20 6f 72  SCII 0x27).** or
2230: 20 61 20 64 6f 75 62 6c 65 20 71 75 6f 74 65 20   a double quote 
2240: 63 68 61 72 61 63 74 65 72 20 28 41 53 43 49 49  character (ASCII
2250: 20 30 78 32 32 29 2e 20 20 54 77 6f 20 71 75 6f   0x22).  Two quo
2260: 74 65 73 20 69 6e 20 61 20 72 6f 77 0a 2a 2a 20  tes in a row.** 
2270: 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 20 61 20  resolve to be a 
2280: 73 69 6e 67 6c 65 20 61 63 74 75 61 6c 20 71 75  single actual qu
2290: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77 69  ote character wi
22a0: 74 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e  thin the string.
22b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22c0: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 56 64  VdbeDequoteP3(Vd
22d0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
22e0: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  {.  Op *pOp;.  a
22f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
2300: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2310: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
2320: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2330: 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64  if( addr<0 || ad
2340: 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  dr>=p->nOp ){.  
2350: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
2360: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
2370: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
2380: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
2390: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 70  p[addr];.  if( p
23a0: 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f 70  Op->p3==0 || pOp
23b0: 2d 3e 70 33 5b 30 5d 3d 3d 30 20 29 20 72 65 74  ->p3[0]==0 ) ret
23c0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  urn;.  if( pOp->
23d0: 70 33 74 79 70 65 3d 3d 50 33 5f 53 54 41 54 49  p3type==P3_STATI
23e0: 43 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  C ){.    pOp->p3
23f0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
2400: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70 4f  pOp->p3);.    pO
2410: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44  p->p3type = P3_D
2420: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 20 20 61 73  YNAMIC;.  }.  as
2430: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 74 79 70  sert( pOp->p3typ
2440: 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 3b  e==P3_DYNAMIC );
2450: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
2460: 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 7d 0a 0a 2f  e(pOp->p3);.}../
2470: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
2480: 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 20  current program 
2490: 73 74 61 72 74 69 6e 67 20 61 74 20 69 6e 73 74  starting at inst
24a0: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 66 6f 72  ruction addr for
24b0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 6f 70   the given.** op
24c0: 63 6f 64 65 20 61 6e 64 20 50 32 20 76 61 6c 75  code and P2 valu
24d0: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
24e0: 64 64 72 65 73 73 20 70 6c 75 73 20 31 20 69 66  ddress plus 1 if
24f0: 20 66 6f 75 6e 64 20 61 6e 64 20 30 20 69 66 20   found and 0 if 
2500: 6e 6f 74 0a 2a 2a 20 66 6f 75 6e 64 2e 0a 2a 2f  not.** found..*/
2510: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2520: 46 69 6e 64 4f 70 28 56 64 62 65 20 2a 70 2c 20  FindOp(Vdbe *p, 
2530: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 6f 70  int addr, int op
2540: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e 74  , int p2){.  int
2550: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   i;.  assert( p-
2560: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2570: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 66 6f 72  IC_INIT );.  for
2580: 28 69 3d 61 64 64 72 3b 20 69 3c 70 2d 3e 6e 4f  (i=addr; i<p->nO
2590: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  p; i++){.    if(
25a0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
25b0: 65 3d 3d 6f 70 20 26 26 20 70 2d 3e 61 4f 70 5b  e==op && p->aOp[
25c0: 69 5d 2e 70 32 3d 3d 70 32 20 29 20 72 65 74 75  i].p2==p2 ) retu
25d0: 72 6e 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  rn i+1;.  }.  re
25e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
25f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f   Return the opco
2600: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61  de for a given a
2610: 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f  ddress..*/.VdbeO
2620: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
2630: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
2640: 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74   addr){.  assert
2650: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
2660: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2670: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
2680: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20   && addr<p->nOp 
2690: 29 3b 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  );.  return &p->
26a0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a 2f 2a  aOp[addr];.}../*
26b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
26c0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
26d0: 62 65 73 20 74 68 65 20 50 33 20 70 61 72 61 6d  bes the P3 param
26e0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
26f0: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
2700: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
2710: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
2720: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
2730: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
2740: 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP3(Op *pOp, cha
2750: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
2760: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
2770: 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  3;.  assert( nTe
2780: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
2790: 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 20  ch( pOp->p3type 
27a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33 5f 50  ){.    case P3_P
27b0: 4f 49 4e 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  OINTER: {.      
27c0: 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22  sprintf(zTemp, "
27d0: 70 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29  ptr(%#x)", (int)
27e0: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  pOp->p3);.      
27f0: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
2800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2810: 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49      case P3_KEYI
2820: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
2830: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
2840: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2850: 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e   (KeyInfo*)pOp->
2860: 70 33 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  p3;.      sprint
2870: 66 28 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66  f(zTemp, "keyinf
2880: 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  o(%d", pKeyInfo-
2890: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
28a0: 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70  i = strlen(zTemp
28b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
28c0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
28d0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
28e0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
28f0: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
2900: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
2910: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
2920: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
2930: 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e  strlen(pColl->zN
2940: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2950: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
2960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2970: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  trcpy(&zTemp[i],
2980: 22 2c 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20 20  ",...");.       
2990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29b0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
29c0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ,';.          if
29d0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
29e0: 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e  tOrder && pKeyIn
29f0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
2a00: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
2a10: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
2a20: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
2a30: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
2a40: 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c  &zTemp[i], pColl
2a50: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2a60: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
2a70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
2a80: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
2a90: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
2aa0: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29 3b  Temp[i],",nil");
2ab0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
2ac0: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
2ad0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
2ae0: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
2af0: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
2b00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2b10: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
2b20: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
2b30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2b40: 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c      case P3_COLL
2b50: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
2b60: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
2b70: 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b  ollSeq*)pOp->p3;
2b80: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
2b90: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
2ba0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
2bb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50 33  Name);.      zP3
2bc0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
2bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2be0: 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46   case P3_FUNCDEF
2bf0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
2c00: 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44  f *pDef = (FuncD
2c10: 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  ef*)pOp->p3;.   
2c20: 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d     char zNum[30]
2c30: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
2c40: 7a 54 65 6d 70 2c 20 22 25 2e 2a 73 22 2c 20 6e  zTemp, "%.*s", n
2c50: 54 65 6d 70 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  Temp, pDef->zNam
2c60: 65 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  e);.      sprint
2c70: 66 28 7a 4e 75 6d 2c 22 28 25 64 29 22 2c 20 70  f(zNum,"(%d)", p
2c80: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
2c90: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 54 65    if( strlen(zTe
2ca0: 6d 70 29 2b 73 74 72 6c 65 6e 28 7a 4e 75 6d 29  mp)+strlen(zNum)
2cb0: 2b 31 3c 3d 6e 54 65 6d 70 20 29 7b 0a 20 20 20  +1<=nTemp ){.   
2cc0: 20 20 20 20 20 73 74 72 63 61 74 28 7a 54 65 6d       strcat(zTem
2cd0: 70 2c 20 7a 4e 75 6d 29 3b 0a 20 20 20 20 20 20  p, zNum);.      
2ce0: 7d 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  }.      zP3 = zT
2cf0: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
2d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
2d10: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33  ult: {.      zP3
2d20: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
2d30: 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20    if( zP3==0 || 
2d40: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2d50: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
2d60: 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  zP3 = "";.      
2d70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2d80: 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 0a 0a 23 69  turn zP3;.}...#i
2d90: 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
2da0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
2db0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 2f 2a 0a 2a  BE_PROFILE)./*.*
2dc0: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
2dd0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
2de0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2df0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
2e00: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
2e10: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
2e20: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
2e30: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
2e40: 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61 72 20  ar *zP3;.  char 
2e50: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74  zPtr[50];.  stat
2e60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
2e70: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
2e80: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 73 5c  -13s %4d %4d %s\
2e90: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
2ea0: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
2eb0: 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73 70 6c  t;.  zP3 = displ
2ec0: 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP3(pOp, zPtr, 
2ed0: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20  sizeof(zPtr));. 
2ee0: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
2ef0: 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20 20 70  Format1,.      p
2f00: 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  c, sqlite3Opcode
2f10: 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64  Names[pOp->opcod
2f20: 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e], pOp->p1, pOp
2f30: 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20 66 66  ->p2, zP3);.  ff
2f40: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
2f50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
2f60: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
2f70: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
2f80: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
2fa0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
2fb0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
2fc0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
2fd0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
2fe0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
2ff0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
3000: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
3010: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
3020: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
3030: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
3040: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
3050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3060: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  beList(.  Vdbe *
3070: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
3080: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
3090: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  */.){.  sqlite *
30a0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
30b0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
30c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
30d0: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
30e0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
30f0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
3100: 65 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64  e does not put d
3110: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f  ynamic strings o
3120: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
3130: 20 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79   stack, they may
3140: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
3150: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
3160: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
3170: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
3180: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
3190: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
31a0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
31b0: 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70   if( p->pTos==&p
31c0: 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20  ->aStack[4] ){. 
31d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 35 3b     for(i=0; i<5;
31e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
31f0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
3200: 73 65 28 26 70 2d 3e 61 53 74 61 63 6b 5b 69 5d  se(&p->aStack[i]
3210: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 61  );.      p->aSta
3220: 63 6b 5b 69 5d 2e 66 6c 61 67 73 20 3d 20 30 3b  ck[i].flags = 0;
3230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
3240: 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a  resOnStack = 0;.
3250: 0a 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a  .  i = p->pc++;.
3260: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20    if( i>=p->nOp 
3270: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
3280: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
3290: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
32a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
32b0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
32c0: 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20  nterrupt ){.    
32d0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
32e0: 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a  LITE_Interrupt;.
32f0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69      if( db->magi
3300: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
3310: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d  BUSY ){.      p-
3320: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53  >rc = SQLITE_MIS
3330: 55 53 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USE;.    }else{.
3340: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
3350: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
3360: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53      }.    rc = S
3370: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
3380: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
3390: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
33a0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
33b0: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
33c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
33d0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
33e0: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
33f0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
3400: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
3410: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
3420: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
3430: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
3440: 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20  em->i = i;      
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
3470: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
3480: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
3490: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
34a0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
34b0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
34c0: 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65  pMem->z = sqlite
34d0: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70  3OpcodeNames[pOp
34e0: 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f  ->opcode];  /* O
34f0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65  pcode */.    pMe
3500: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
3510: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
3520: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
3530: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
3540: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
3550: 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  8;.    pMem++;..
3560: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
3570: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
3580: 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31  Mem->i = pOp->p1
3590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
35b0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
35c0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
35d0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
35e0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
35f0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
3600: 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e   pMem->i = pOp->
3610: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3630: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
3640: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
3650: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
3660: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
3670: 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c  ags = MEM_Short|
3680: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
3690: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
36a0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
36b0: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
36c0: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
36d0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
36e0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
36f0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
3700: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
3710: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
3720: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
3730: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
3740: 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  pMem;.    p->rc 
3750: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
3760: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
3770: 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
3780: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
3790: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37a0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
37b0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
37c0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
37d0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
37e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
37f0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
3800: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
3810: 45 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  EBUG.  int nOp =
3820: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
3830: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
3840: 70 3c 32 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<2 ) return;.  
3850: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f  pOp = &p->aOp[nO
3860: 70 2d 32 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p-2];.  if( pOp-
3870: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70  >opcode==OP_Noop
3880: 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29   && pOp->p3!=0 )
3890: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
38a0: 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20   *z = pOp->p3;. 
38b0: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
38c0: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
38d0: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
38e0: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 23  s]\n", z);.  }.#
38f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
3900: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
3910: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
3920: 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e  cution.  This in
3930: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
3940: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
3950: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
3960: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
3970: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
3980: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
3990: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
39a0: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
39b0: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
39c0: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
39d0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
39e0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2f 0a 76 6f  eExec().  .*/.vo
39f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
3a00: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
3a10: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3a30: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
3a40: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
3a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3a60: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
3a70: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
3a80: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ent */.  int isE
3a90: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
3aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3ab0: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
3ac0: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
3ad0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
3ae0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
3af0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3b00: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3b10: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
3b20: 2a 20 41 64 64 20 61 20 48 41 4c 54 20 69 6e 73  * Add a HALT ins
3b30: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
3b40: 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65 20  very end of the 
3b50: 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
3b60: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 7c 7c  if( p->nOp==0 ||
3b70: 20 28 70 2d 3e 61 4f 70 20 26 26 20 70 2d 3e 61   (p->aOp && p->a
3b80: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63  Op[p->nOp-1].opc
3b90: 6f 64 65 21 3d 4f 50 5f 48 61 6c 74 29 20 29 7b  ode!=OP_Halt) ){
3ba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3bb0: 41 64 64 4f 70 28 70 2c 20 4f 50 5f 48 61 6c 74  AddOp(p, OP_Halt
3bc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
3bd0: 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f  /* No instructio
3be0: 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f  n ever pushes mo
3bf0: 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65  re than a single
3c00: 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68   element onto th
3c10: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41  e.  ** stack.  A
3c20: 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76  nd the stack nev
3c30: 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63  er grows on succ
3c40: 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e  essive execution
3c50: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61  s of the.  ** sa
3c60: 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65  me loop.  So the
3c70: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
3c80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73   instructions is
3c90: 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a   an upper bound.
3ca0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69    ** on the maxi
3cb0: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20  mum stack depth 
3cc0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
3cd0: 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61   ** Allocation a
3ce0: 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61  ll the stack spa
3cf0: 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20  ce we will ever 
3d00: 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  need..  */.  if(
3d10: 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b   p->aStack==0 ){
3d20: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e  .    p->nVar = n
3d30: 56 61 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Var;.    assert(
3d40: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20   nVar>=0 );.    
3d50: 6e 20 3d 20 69 73 45 78 70 6c 61 69 6e 20 3f 20  n = isExplain ? 
3d60: 31 30 20 3a 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  10 : p->nOp;.   
3d70: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
3d80: 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  iteMalloc(.     
3d90: 20 6e 2a 28 73 69 7a 65 6f 66 28 70 2d 3e 61 53   n*(sizeof(p->aS
3da0: 74 61 63 6b 5b 30 5d 29 2b 73 69 7a 65 6f 66 28  tack[0])+sizeof(
3db0: 4d 65 6d 2a 29 29 20 20 20 20 20 20 20 20 20 20  Mem*))          
3dc0: 2f 2a 20 61 53 74 61 63 6b 2c 20 61 70 41 72 67  /* aStack, apArg
3dd0: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 70 2d 3e 6e   */.      + p->n
3de0: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Var*sizeof(Mem) 
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 56 61           /* apVa
3e10: 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20  r */.    );.    
3e20: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 20  p->apArg = (Mem 
3e30: 2a 2a 29 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 5d  **)&p->aStack[n]
3e40: 3b 0a 20 20 20 20 70 2d 3e 61 70 56 61 72 20 3d  ;.    p->apVar =
3e50: 20 28 4d 65 6d 20 2a 29 26 70 2d 3e 61 70 41 72   (Mem *)&p->apAr
3e60: 67 5b 6e 5d 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  g[n];.    for(n=
3e70: 30 3b 20 6e 3c 70 2d 3e 6e 56 61 72 3b 20 6e 2b  0; n<p->nVar; n+
3e80: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 70 56  +){.      p->apV
3e90: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
3ea0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  M_Null;.    }.  
3eb0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
3ec0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28 70 2d  _DEBUG.  if( (p-
3ed0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
3ee0: 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 29  ITE_VdbeListing)
3ef0: 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74  !=0.    || sqlit
3f00: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22  e3OsFileExists("
3f10: 76 64 62 65 5f 65 78 70 6c 61 69 6e 22 29 0a 20  vdbe_explain"). 
3f20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3f30: 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20     printf("VDBE 
3f40: 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a  Program Listing:
3f50: 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
3f60: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29  3VdbePrintSql(p)
3f70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3f80: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
3f90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3fa0: 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20  PrintOp(stdout, 
3fb0: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
3fc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
3fd0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
3fe0: 73 74 73 28 22 76 64 62 65 5f 74 72 61 63 65 22  sts("vdbe_trace"
3ff0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63  ) ){.    p->trac
4000: 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a  e = stdout;.  }.
4010: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 54 6f 73  #endif.  p->pTos
4020: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31   = &p->aStack[-1
4030: 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  ];.  p->pc = -1;
4040: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
4050: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75  E_OK;.  p->uniqu
4060: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72  eCnt = 0;.  p->r
4070: 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a  eturnDepth = 0;.
4080: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
4090: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
40a0: 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b  ->popStack =  0;
40b0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
40c0: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
40d0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
40e0: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
40f0: 68 61 6e 67 65 20 3d 20 30 3b 0a 23 69 66 64 65  hange = 0;.#ifde
4100: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
4110: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
4120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4130: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
4140: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
4150: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70   0;.      p->aOp
4160: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
4170: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
4180: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  .}.../*.** Remov
4190: 65 20 61 6e 79 20 65 6c 65 6d 65 6e 74 73 20 74  e any elements t
41a0: 68 61 74 20 72 65 6d 61 69 6e 20 6f 6e 20 74 68  hat remain on th
41b0: 65 20 73 6f 72 74 65 72 20 66 6f 72 20 74 68 65  e sorter for the
41c0: 20 56 44 42 45 20 67 69 76 65 6e 2e 0a 2a 2f 0a   VDBE given..*/.
41d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
41e0: 53 6f 72 74 65 72 52 65 73 65 74 28 56 64 62 65  SorterReset(Vdbe
41f0: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
4200: 2d 3e 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 53  ->pSort ){.    S
4210: 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d  orter *pSorter =
4220: 20 70 2d 3e 70 53 6f 72 74 3b 0a 20 20 20 20 70   p->pSort;.    p
4230: 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f 72 74 65  ->pSort = pSorte
4240: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  r->pNext;.    sq
4250: 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74 65 72  liteFree(pSorter
4260: 2d 3e 7a 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c  ->zKey);.    sql
4270: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
4280: 73 65 28 26 70 53 6f 72 74 65 72 2d 3e 64 61 74  se(&pSorter->dat
4290: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  a);.    sqliteFr
42a0: 65 65 28 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d  ee(pSorter);.  }
42b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
42c0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c  ll resources all
42d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 41 67 67  ociated with Agg
42e0: 45 6c 65 6d 20 70 45 6c 65 6d 2c 20 61 6e 20 65  Elem pElem, an e
42f0: 6c 65 6d 65 6e 74 20 6f 66 0a 2a 2a 20 61 67 67  lement of.** agg
4300: 72 65 67 61 74 65 20 70 41 67 67 2e 0a 2a 2f 0a  regate pAgg..*/.
4310: 76 6f 69 64 20 66 72 65 65 41 67 67 45 6c 65 6d  void freeAggElem
4320: 28 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 2c  (AggElem *pElem,
4330: 20 41 67 67 20 2a 70 41 67 67 29 7b 0a 20 20 69   Agg *pAgg){.  i
4340: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
4350: 20 69 3c 70 41 67 67 2d 3e 6e 4d 65 6d 3b 20 69   i<pAgg->nMem; i
4360: 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  ++){.    Mem *pM
4370: 65 6d 20 3d 20 26 70 45 6c 65 6d 2d 3e 61 4d 65  em = &pElem->aMe
4380: 6d 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 41  m[i];.    if( pA
4390: 67 67 2d 3e 61 70 46 75 6e 63 20 26 26 20 70 41  gg->apFunc && pA
43a0: 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 20 26 26  gg->apFunc[i] &&
43b0: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
43c0: 4d 45 4d 5f 41 67 67 43 74 78 29 21 3d 30 20 29  MEM_AggCtx)!=0 )
43d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
43e0: 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 20  context ctx;.   
43f0: 20 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70     ctx.pFunc = p
4400: 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 3b 0a  Agg->apFunc[i];.
4410: 20 20 20 20 20 20 63 74 78 2e 73 2e 66 6c 61 67        ctx.s.flag
4420: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
4430: 20 20 20 20 63 74 78 2e 70 41 67 67 20 3d 20 70      ctx.pAgg = p
4440: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 63 74  Mem->z;.      ct
4450: 78 2e 63 6e 74 20 3d 20 70 4d 65 6d 2d 3e 69 3b  x.cnt = pMem->i;
4460: 0a 20 20 20 20 20 20 63 74 78 2e 69 73 53 74 65  .      ctx.isSte
4470: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 74 78  p = 0;.      ctx
4480: 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  .isError = 0;.  
4490: 20 20 20 20 28 2a 70 41 67 67 2d 3e 61 70 46 75      (*pAgg->apFu
44a0: 6e 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65  nc[i]->xFinalize
44b0: 29 28 26 63 74 78 29 3b 0a 20 20 20 20 20 20 70  )(&ctx);.      p
44c0: 4d 65 6d 2d 3e 7a 20 3d 20 63 74 78 2e 70 41 67  Mem->z = ctx.pAg
44d0: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  g;.      if( pMe
44e0: 6d 2d 3e 7a 21 3d 30 20 26 26 20 70 4d 65 6d 2d  m->z!=0 && pMem-
44f0: 3e 7a 21 3d 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74  >z!=pMem->zShort
4500: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4510: 74 65 46 72 65 65 28 70 4d 65 6d 2d 3e 7a 29 3b  teFree(pMem->z);
4520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4530: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
4540: 65 61 73 65 28 26 63 74 78 2e 73 29 3b 0a 20 20  ease(&ctx.s);.  
4550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
4560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
4570: 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
4580: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  }.  }.  sqliteFr
4590: 65 65 28 70 45 6c 65 6d 29 3b 0a 7d 0a 0a 2f 2a  ee(pElem);.}../*
45a0: 0a 2a 2a 20 52 65 73 65 74 20 61 6e 20 41 67 67  .** Reset an Agg
45b0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 6c   structure.  Del
45c0: 65 74 65 20 61 6c 6c 20 69 74 73 20 63 6f 6e 74  ete all its cont
45d0: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ents..**.** For 
45e0: 69 6e 73 74 61 6c 6c 61 62 6c 65 20 61 67 67 72  installable aggr
45f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c  egate functions,
4600: 20 69 66 20 74 68 65 20 73 74 65 70 20 66 75 6e   if the step fun
4610: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ction has been.*
4620: 2a 20 63 61 6c 6c 65 64 2c 20 6d 61 6b 65 20 73  * called, make s
4630: 75 72 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65  ure the finalize
4640: 72 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  r function has a
4650: 6c 73 6f 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e  lso been called.
4660: 20 20 54 68 65 0a 2a 2a 20 66 69 6e 61 6c 69 7a    The.** finaliz
4670: 65 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  er might need to
4680: 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 74 68 61   free memory tha
4690: 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  t was allocated 
46a0: 61 73 20 70 61 72 74 20 6f 66 20 69 74 73 0a 2a  as part of its.*
46b0: 2a 20 70 72 69 76 61 74 65 20 63 6f 6e 74 65 78  * private contex
46c0: 74 2e 20 20 49 66 20 74 68 65 20 66 69 6e 61 6c  t.  If the final
46d0: 69 7a 65 72 20 68 61 73 20 6e 6f 74 20 62 65 65  izer has not bee
46e0: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2c 20 63 61  n called yet, ca
46f0: 6c 6c 20 69 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a 2a  ll it.** now..**
4700: 0a 2a 2a 20 49 66 20 64 62 20 69 73 20 4e 55 4c  .** If db is NUL
4710: 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  L, then this is 
4720: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
4730: 6d 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 65  m sqliteVdbeRese
4740: 74 28 29 2e 20 49 6e 0a 2a 2a 20 74 68 69 73 20  t(). In.** this 
4750: 63 61 73 65 20 63 6c 65 61 6e 20 75 70 20 61 6c  case clean up al
4760: 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
4770: 74 68 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 75  the temp-table u
4780: 73 65 64 20 66 6f 72 0a 2a 2a 20 61 67 67 72 65  sed for.** aggre
4790: 67 61 74 65 73 20 28 69 66 20 69 74 20 77 61 73  gates (if it was
47a0: 20 65 76 65 72 20 6f 70 65 6e 65 64 29 2e 0a 2a   ever opened)..*
47b0: 2a 0a 2a 2a 20 49 66 20 64 62 20 69 73 20 6e 6f  *.** If db is no
47c0: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  t NULL, then thi
47d0: 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  s is being calle
47e0: 64 20 66 72 6f 6d 20 77 69 74 68 20 61 6e 20 4f  d from with an O
47f0: 50 5f 41 67 67 52 65 73 65 74 0a 2a 2a 20 6f 70  P_AggReset.** op
4800: 63 6f 64 65 2e 20 4f 70 65 6e 20 74 68 65 20 74  code. Open the t
4810: 65 6d 70 2d 74 61 62 6c 65 2c 20 69 66 20 69 74  emp-table, if it
4820: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
4830: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
4840: 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 63  .** delete the c
4850: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74  ontents of the t
4860: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 61 67  able used for ag
4870: 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
4880: 69 6f 6e 2c 20 72 65 61 64 79 0a 2a 2a 20 66 6f  ion, ready.** fo
4890: 72 20 74 68 65 20 6e 65 78 74 20 72 6f 75 6e 64  r the next round
48a0: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 70 72   of aggregate pr
48b0: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
48c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 52   sqlite3VdbeAggR
48d0: 65 73 65 74 28 73 71 6c 69 74 65 20 2a 64 62 2c  eset(sqlite *db,
48e0: 20 41 67 67 20 2a 70 41 67 67 2c 20 4b 65 79 49   Agg *pAgg, KeyI
48f0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 29 7b 0a  nfo *pKeyInfo){.
4900: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
4910: 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  BtCursor *pCsr =
4920: 20 70 41 67 67 2d 3e 70 43 73 72 3b 0a 0a 20 20   pAgg->pCsr;..  
4930: 61 73 73 65 72 74 28 20 28 70 43 73 72 20 26 26  assert( (pCsr &&
4940: 20 70 41 67 67 2d 3e 6e 54 61 62 3e 30 29 20 7c   pAgg->nTab>0) |
4950: 7c 20 28 21 70 43 73 72 20 26 26 20 70 41 67 67  | (!pCsr && pAgg
4960: 2d 3e 6e 54 61 62 3d 3d 30 29 0a 20 20 20 20 20  ->nTab==0).     
4970: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d      || sqlite3_m
4980: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 3b 0a  alloc_failed );.
4990: 0a 20 20 2f 2a 20 49 66 20 70 43 73 72 20 69 73  .  /* If pCsr is
49a0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
49b0: 74 68 65 20 74 61 62 6c 65 20 75 73 65 64 20 66  the table used f
49c0: 6f 72 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  or aggregate inf
49d0: 6f 72 6d 61 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  ormation.  ** is
49e0: 20 6f 70 65 6e 2e 20 4c 6f 6f 70 20 74 68 72 6f   open. Loop thro
49f0: 75 67 68 20 69 74 20 61 6e 64 20 66 72 65 65 20  ugh it and free 
4a00: 74 68 65 20 41 67 67 45 6c 65 6d 2a 20 73 74 72  the AggElem* str
4a10: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 61  ucture pointed a
4a20: 74 0a 20 20 2a 2a 20 62 79 20 65 61 63 68 20 65  t.  ** by each e
4a30: 6e 74 72 79 2e 20 49 66 20 74 68 65 20 66 69 6e  ntry. If the fin
4a40: 61 6c 69 7a 65 72 20 68 61 73 20 6e 6f 74 20 62  alizer has not b
4a50: 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20 61  een called for a
4a60: 6e 20 41 67 67 45 6c 65 6d 2c 0a 20 20 2a 2a 20  n AggElem,.  ** 
4a70: 64 6f 20 74 68 61 74 20 74 6f 6f 2e 20 46 69 6e  do that too. Fin
4a80: 61 6c 6c 79 2c 20 63 6c 65 61 72 20 74 68 65 20  ally, clear the 
4a90: 62 74 72 65 65 20 74 61 62 6c 65 20 69 74 73 65  btree table itse
4aa0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  lf..  */.  if( p
4ab0: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  Csr ){.    int r
4ac0: 65 73 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  es;.    assert( 
4ad0: 70 41 67 67 2d 3e 70 42 74 72 65 65 20 29 3b 0a  pAgg->pBtree );.
4ae0: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
4af0: 2d 3e 6e 54 61 62 3e 30 20 29 3b 0a 0a 20 20 20  ->nTab>0 );..   
4b00: 20 72 63 3d 73 71 6c 69 74 65 33 42 74 72 65 65   rc=sqlite3Btree
4b10: 46 69 72 73 74 28 70 43 73 72 2c 20 26 72 65 73  First(pCsr, &res
4b20: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 65  );.    while( re
4b30: 73 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  s==0 && rc==SQLI
4b40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 41  TE_OK ){.      A
4b50: 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  ggElem *pElem;. 
4b60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4b70: 33 42 74 72 65 65 44 61 74 61 28 70 43 73 72 2c  3BtreeData(pCsr,
4b80: 20 30 2c 20 73 69 7a 65 6f 66 28 41 67 67 45 6c   0, sizeof(AggEl
4b90: 65 6d 2a 29 2c 20 28 63 68 61 72 20 2a 29 26 70  em*), (char *)&p
4ba0: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Elem);.      if(
4bb0: 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   res!=SQLITE_OK 
4bc0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4bd0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
4be0: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
4bf0: 2d 3e 61 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20  ->apFunc!=0 );. 
4c00: 20 20 20 20 20 66 72 65 65 41 67 67 45 6c 65 6d       freeAggElem
4c10: 28 70 45 6c 65 6d 2c 20 70 41 67 67 29 3b 0a 20  (pElem, pAgg);. 
4c20: 20 20 20 20 20 72 63 3d 73 71 6c 69 74 65 33 42       rc=sqlite3B
4c30: 74 72 65 65 4e 65 78 74 28 70 43 73 72 2c 20 26  treeNext(pCsr, &
4c40: 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  res);.    }.    
4c50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4c60: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
4c70: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
4c80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
4c90: 73 65 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  seCursor(pCsr);.
4ca0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
4cb0: 43 6c 65 61 72 54 61 62 6c 65 28 70 41 67 67 2d  ClearTable(pAgg-
4cc0: 3e 70 42 74 72 65 65 2c 20 70 41 67 67 2d 3e 6e  >pBtree, pAgg->n
4cd0: 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a  Tab);.  }else{ .
4ce0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
4cf0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
4d00: 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 61 67  n because the ag
4d10: 67 72 65 67 61 74 6f 72 20 77 61 73 20 6e 65 76  gregator was nev
4d20: 65 72 20 75 73 65 64 2c 0a 20 20 20 20 2a 2a 20  er used,.    ** 
4d30: 6f 72 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  or it could be t
4d40: 68 61 74 20 69 74 20 77 61 73 20 75 73 65 64 20  hat it was used 
4d50: 62 75 74 20 74 68 65 72 65 20 77 61 73 20 6e 6f  but there was no
4d60: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
4d70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
4d80: 20 70 41 67 67 2d 3e 70 43 75 72 72 65 6e 74 20   pAgg->pCurrent 
4d90: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 41 67 67  ){.      freeAgg
4da0: 45 6c 65 6d 28 70 41 67 67 2d 3e 70 43 75 72 72  Elem(pAgg->pCurr
4db0: 65 6e 74 2c 20 70 41 67 67 29 3b 0a 20 20 20 20  ent, pAgg);.    
4dc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 64  }.  }..  /* If d
4dd0: 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  b is not NULL an
4de0: 64 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65  d we have not ye
4df0: 74 20 61 6e 64 20 77 65 20 68 61 76 65 20 6e 6f  t and we have no
4e00: 74 20 79 65 74 20 6f 70 65 6e 65 64 0a 20 20 2a  t yet opened.  *
4e10: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
4e20: 62 74 72 65 65 20 74 68 65 6e 20 64 6f 20 73 6f  btree then do so
4e30: 20 61 6e 64 20 63 72 65 61 74 65 20 74 68 65 20   and create the 
4e40: 74 61 62 6c 65 20 74 6f 20 73 74 6f 72 65 20 61  table to store a
4e50: 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 69 6e  ggregate.  ** in
4e60: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  formation..  **.
4e70: 20 20 2a 2a 20 49 66 20 64 62 20 69 73 20 4e 55    ** If db is NU
4e80: 4c 4c 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  LL, then close t
4e90: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 74 72  he temporary btr
4ea0: 65 65 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ee if it is open
4eb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 20  ..  */.  if( db 
4ec0: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 41 67 67  ){.    if( !pAgg
4ed0: 2d 3e 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ->pBtree ){.    
4ee0: 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
4ef0: 6e 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nTab==0 );.     
4f00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f10: 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 22 3a  eeFactory(db, ":
4f20: 6d 65 6d 6f 72 79 3a 22 2c 20 30 2c 20 54 45 4d  memory:", 0, TEM
4f30: 50 5f 50 41 47 45 53 2c 20 26 70 41 67 67 2d 3e  P_PAGES, &pAgg->
4f40: 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 69  pBtree);.      i
4f50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4f60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
4f70: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
4f80: 42 65 67 69 6e 54 72 61 6e 73 28 70 41 67 67 2d  BeginTrans(pAgg-
4f90: 3e 70 42 74 72 65 65 2c 20 31 29 3b 0a 20 20 20  >pBtree, 1);.   
4fa0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4fb0: 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
4fc0: 70 41 67 67 2d 3e 70 42 74 72 65 65 2c 20 26 70  pAgg->pBtree, &p
4fd0: 41 67 67 2d 3e 6e 54 61 62 2c 20 30 29 3b 0a 20  Agg->nTab, 0);. 
4fe0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
4ff0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5000: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
5010: 73 65 72 74 28 20 70 41 67 67 2d 3e 6e 54 61 62  sert( pAgg->nTab
5020: 21 3d 30 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  !=0 );..    rc =
5030: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
5040: 73 6f 72 28 70 41 67 67 2d 3e 70 42 74 72 65 65  sor(pAgg->pBtree
5050: 2c 20 70 41 67 67 2d 3e 6e 54 61 62 2c 20 31 2c  , pAgg->nTab, 1,
5060: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5070: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
5080: 65 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 26 70 41  e, pKeyInfo, &pA
5090: 67 67 2d 3e 70 43 73 72 29 3b 0a 20 20 20 20 69  gg->pCsr);.    i
50a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
50b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
50c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
50d0: 41 67 67 2d 3e 70 42 74 72 65 65 20 29 7b 0a 20  Agg->pBtree ){. 
50e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
50f0: 65 43 6c 6f 73 65 28 70 41 67 67 2d 3e 70 42 74  eClose(pAgg->pBt
5100: 72 65 65 29 3b 0a 20 20 20 20 20 20 70 41 67 67  ree);.      pAgg
5110: 2d 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  ->pBtree = 0;.  
5120: 20 20 20 20 70 41 67 67 2d 3e 6e 54 61 62 20 3d      pAgg->nTab =
5130: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41   0;.    }.    pA
5140: 67 67 2d 3e 70 43 73 72 20 3d 20 30 3b 0a 20 20  gg->pCsr = 0;.  
5150: 7d 0a 0a 20 20 69 66 28 20 70 41 67 67 2d 3e 61  }..  if( pAgg->a
5160: 70 46 75 6e 63 20 29 7b 20 0a 20 20 20 20 73 71  pFunc ){ .    sq
5170: 6c 69 74 65 46 72 65 65 28 70 41 67 67 2d 3e 61  liteFree(pAgg->a
5180: 70 46 75 6e 63 29 3b 0a 20 20 20 20 70 41 67 67  pFunc);.    pAgg
5190: 2d 3e 61 70 46 75 6e 63 20 3d 20 30 3b 0a 20 20  ->apFunc = 0;.  
51a0: 7d 0a 20 20 70 41 67 67 2d 3e 70 43 75 72 72 65  }.  pAgg->pCurre
51b0: 6e 74 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e  nt = 0;.  pAgg->
51c0: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 41 67 67  nMem = 0;.  pAgg
51d0: 2d 3e 73 65 61 72 63 68 69 6e 67 20 3d 20 30 3b  ->searching = 0;
51e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
51f0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  _OK;.}.../*.** D
5200: 65 6c 65 74 65 20 61 20 6b 65 79 6c 69 73 74 0a  elete a keylist.
5210: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5220: 64 62 65 4b 65 79 6c 69 73 74 46 72 65 65 28 4b  dbeKeylistFree(K
5230: 65 79 6c 69 73 74 20 2a 70 29 7b 0a 20 20 77 68  eylist *p){.  wh
5240: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 4b 65  ile( p ){.    Ke
5250: 79 6c 69 73 74 20 2a 70 4e 65 78 74 20 3d 20 70  ylist *pNext = p
5260: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
5270: 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20  iteFree(p);.    
5280: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d  p = pNext;.  }.}
5290: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
52a0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
52b0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
52c0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
52d0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68   happens.** to h
52e0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
52f0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
5300: 6f 72 28 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  or(Cursor *pCx){
5310: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
5320: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5330: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
5340: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
5350: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
5360: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
5370: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
5380: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
5390: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
53a0: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73  x->pBt);.  }.  s
53b0: 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 70  qliteFree(pCx->p
53c0: 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  Data);.  sqliteF
53d0: 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b  ree(pCx->aType);
53e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
53f0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  x);.}../*.** Clo
5400: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a  se all cursors.*
5410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
5420: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
5430: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
5440: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5450: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
5460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
5470: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 61 70 43  reeCursor(p->apC
5480: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  sr[i]);.  }.  sq
5490: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 70 43 73  liteFree(p->apCs
54a0: 72 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d  r);.  p->apCsr =
54b0: 20 30 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72   0;.  p->nCursor
54c0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
54d0: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
54e0: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a  fter execution..
54f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5500: 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ne will automati
5510: 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20  cally close any 
5520: 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20  cursors, lists, 
5530: 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72  and/or.** sorter
5540: 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74  s that were left
5550: 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20   open.  It also 
5560: 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75  deletes the valu
5570: 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c  es of.** variabl
5580: 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d  es in the aVar[]
5590: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
55a0: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
55b0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
55c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  ;.  if( p->aStac
55d0: 6b 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 54  k ){.    Mem *pT
55e0: 6f 73 20 3d 20 70 2d 3e 70 54 6f 73 3b 0a 20 20  os = p->pTos;.  
55f0: 20 20 77 68 69 6c 65 28 20 70 54 6f 73 3e 3d 70    while( pTos>=p
5600: 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  ->aStack ){.    
5610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5620: 52 65 6c 65 61 73 65 28 70 54 6f 73 29 3b 0a 20  Release(pTos);. 
5630: 20 20 20 20 20 70 54 6f 73 2d 2d 3b 0a 20 20 20       pTos--;.   
5640: 20 7d 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d   }.    p->pTos =
5650: 20 70 54 6f 73 3b 0a 20 20 7d 0a 20 20 63 6c 6f   pTos;.  }.  clo
5660: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
5670: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
5680: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5690: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
56a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
56b0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 2d 3e  eMemRelease(&p->
56c0: 61 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aMem[i]);.    }.
56d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
56e0: 28 70 2d 3e 61 4d 65 6d 29 3b 0a 20 20 70 2d 3e  (p->aMem);.  p->
56f0: 61 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  aMem = 0;.  p->n
5700: 4d 65 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Mem = 0;.  if( p
5710: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ->pList ){.    s
5720: 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c 69 73  qlite3VdbeKeylis
5730: 74 46 72 65 65 28 70 2d 3e 70 4c 69 73 74 29 3b  tFree(p->pList);
5740: 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20 3d 20  .    p->pList = 
5750: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
5760: 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28  VdbeSorterReset(
5770: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 69  p);.  if( p->pFi
5780: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  le ){.    if( p-
5790: 3e 70 46 69 6c 65 21 3d 73 74 64 69 6e 20 29 20  >pFile!=stdin ) 
57a0: 66 63 6c 6f 73 65 28 70 2d 3e 70 46 69 6c 65 29  fclose(p->pFile)
57b0: 3b 0a 20 20 20 20 70 2d 3e 70 46 69 6c 65 20 3d  ;.    p->pFile =
57c0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   0;.  }.  if( p-
57d0: 3e 61 7a 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  >azField ){.    
57e0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 7a  sqliteFree(p->az
57f0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61  Field);.    p->a
5800: 7a 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 7d 0a  zField = 0;.  }.
5810: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 30 3b    p->nField = 0;
5820: 0a 20 20 69 66 28 20 70 2d 3e 7a 4c 69 6e 65 20  .  if( p->zLine 
5830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5840: 65 28 70 2d 3e 7a 4c 69 6e 65 29 3b 0a 20 20 20  e(p->zLine);.   
5850: 20 70 2d 3e 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20   p->zLine = 0;. 
5860: 20 7d 0a 20 20 70 2d 3e 6e 4c 69 6e 65 41 6c 6c   }.  p->nLineAll
5870: 6f 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  oc = 0;.  sqlite
5880: 33 56 64 62 65 41 67 67 52 65 73 65 74 28 30 2c  3VdbeAggReset(0,
5890: 20 26 70 2d 3e 61 67 67 2c 20 30 29 3b 0a 20 20   &p->agg, 0);.  
58a0: 69 66 28 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74  if( p->keylistSt
58b0: 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ack ){.    int i
58c0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 20 3d 20  i;.    for(ii = 
58d0: 30 3b 20 69 69 20 3c 20 70 2d 3e 6b 65 79 6c 69  0; ii < p->keyli
58e0: 73 74 53 74 61 63 6b 44 65 70 74 68 3b 20 69 69  stStackDepth; ii
58f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
5900: 65 33 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65  e3VdbeKeylistFre
5910: 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63  e(p->keylistStac
5920: 6b 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  k[ii]);.    }.  
5930: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
5940: 6b 65 79 6c 69 73 74 53 74 61 63 6b 29 3b 0a 20  keylistStack);. 
5950: 20 20 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61     p->keylistSta
5960: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20  ckDepth = 0;.   
5970: 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b   p->keylistStack
5980: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
5990: 74 65 46 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78  teFree(p->contex
59a0: 74 53 74 61 63 6b 29 3b 0a 20 20 70 2d 3e 63 6f  tStack);.  p->co
59b0: 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ntextStack = 0;.
59c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
59d0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
59e0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ErrMsg = 0;.}../
59f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
5a00: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5a10: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
5a20: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
5a30: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
5a40: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
5a50: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
5a60: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
5a70: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
5a80: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
5a90: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
5aa0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
5ab0: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
5ac0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
5ad0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
5ae0: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
5af0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
5b00: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
5b10: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
5b20: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
5b30: 61 73 73 65 72 74 28 20 30 3d 3d 70 2d 3e 6e 52  assert( 0==p->nR
5b40: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 2d  esColumn );.  p-
5b50: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
5b60: 65 73 43 6f 6c 75 6d 6e 3b 0a 7d 0a 0a 2f 2a 0a  esColumn;.}../*.
5b70: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
5b80: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
5b90: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
5ba0: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
5bb0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
5bc0: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
5bd0: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
5be0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
5bf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
5c00: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
5c10: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
5c20: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
5c30: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ols()..**.** If 
5c40: 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74  N==P3_STATIC  it
5c50: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d   means that zNam
5c60: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
5c70: 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61  o a constant sta
5c80: 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e  tic.** string an
5c90: 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  d we can just co
5ca0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20  py the pointer. 
5cb0: 49 66 20 69 74 20 69 73 20 50 33 5f 44 59 4e 41  If it is P3_DYNA
5cc0: 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  MIC, then .** th
5cd0: 65 20 73 74 72 69 6e 67 20 69 73 20 66 72 65 65  e string is free
5ce0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 46 72  d using sqliteFr
5cf0: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
5d00: 62 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77  be is finished w
5d10: 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72  ith.** it. Other
5d20: 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66  wise, N bytes of
5d30: 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65   zName are copie
5d40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5d50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
5d60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  Vdbe *p, int idx
5d70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5d80: 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ame, int N){.  i
5d90: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
5da0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
5db0: 28 20 69 64 78 3c 28 32 2a 70 2d 3e 6e 52 65 73  ( idx<(2*p->nRes
5dc0: 43 6f 6c 75 6d 6e 29 20 29 3b 0a 0a 20 20 2f 2a  Column) );..  /*
5dd0: 20 49 66 20 74 68 65 20 56 64 62 65 2e 61 43 6f   If the Vdbe.aCo
5de0: 6c 4e 61 6d 65 20 61 72 72 61 79 20 68 61 73 20  lName array has 
5df0: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 61 6c 6c  not yet been all
5e00: 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
5e10: 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
5e20: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 61 43 6f  */.  if( !p->aCo
5e30: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74  lName ){.    int
5e40: 20 69 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 4e   i;.    p->aColN
5e50: 61 6d 65 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c  ame = (Mem *)sql
5e60: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
5e70: 28 4d 65 6d 29 2a 70 2d 3e 6e 52 65 73 43 6f 6c  (Mem)*p->nResCol
5e80: 75 6d 6e 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  umn*2);.    if( 
5e90: 21 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 29 7b 0a  !p->aColName ){.
5ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5eb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
5ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5ed0: 28 32 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  (2*p->nResColumn
5ee0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ); i++){.      p
5ef0: 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 5d 2e 66 6c  ->aColName[i].fl
5f00: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
5f10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
5f20: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
5f30: 6c 4e 61 6d 65 5b 69 64 78 5d 29 3b 0a 20 20 69  lName[idx]);.  i
5f40: 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43  f( N==P3_DYNAMIC
5f50: 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43   || N==P3_STATIC
5f60: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
5f70: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
5f80: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
5f90: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
5fa0: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
5fb0: 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
5fc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
5fd0: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
5fe0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53  ame, zName, N, S
5ff0: 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54  QLITE_UTF8,SQLIT
6000: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
6010: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6020: 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44  TE_OK && N==P3_D
6030: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43  YNAMIC ){.    pC
6040: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
6050: 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73  (pColName->flags
6060: 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c  &(~MEM_Static))|
6070: 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f  MEM_Dyn;.    pCo
6080: 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b  lName->xDel = 0;
6090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
60a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
60b0: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
60c0: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
60d0: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
60e0: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
60f0: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
6100: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
6110: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
6120: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
6130: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
6140: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
6150: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
6160: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
6170: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
6180: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
6190: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
61a0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
61b0: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
61c0: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 6e 74  lite *db){.  int
61d0: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
61e0: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
61f0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
6200: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
6210: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
6220: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
6230: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
6240: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
6250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6260: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
6270: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6280: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6290: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
62a0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
62b0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
62c0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
62d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
62e0: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
62f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
6300: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
6310: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
6320: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
6330: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
6340: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
6350: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
6360: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
6370: 20 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6d 6d     if( db->xComm
6380: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
6390: 43 6f 6d 6d 69 74 41 72 67 29 20 29 7b 0a 20 20  CommitArg) ){.  
63a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
63b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
63c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
63d0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
63e0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
63f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
6400: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
6410: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
6420: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
6430: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
6440: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
6450: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
6460: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
6470: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
6480: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
6490: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
64a0: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
64b0: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
64c0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
64d0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
64e0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20  se is :memory:. 
64f0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   In that case we
6500: 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70   do.  ** not sup
6510: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
6520: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
6530: 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c  so use the simpl
6540: 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a  e case then.  **
6550: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
6560: 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74   0==strlen(sqlit
6570: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
6580: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
6590: 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  t)) || nTrans<=1
65a0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
65b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
65c0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
65d0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
65e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
65f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
6600: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
6610: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6620: 65 53 79 6e 63 28 70 42 74 2c 20 30 29 3b 0a 20  eSync(pBt, 0);. 
6630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6640: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
6650: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
6660: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
6670: 66 75 6c 6c 79 20 73 79 6e 63 65 64 20 2a 2f 0a  fully synced */.
6680: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
66a0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
66b0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; i++){.       
66c0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
66d0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
66e0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
66f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6700: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42  e3BtreeCommit(pB
6710: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
6720: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6730: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
6740: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
6750: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
6760: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6770: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
6780: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
6790: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
67a0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
67b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
67c0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
67d0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65  omicly..  */.  e
67e0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
67f0: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
6800: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
6810: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6820: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
6830: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
6840: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
6850: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
6860: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 4f 73  [0].pBt);.    Os
6870: 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 0a 20 20  File master;..  
6880: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
6890: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
68a0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f  e name */.    do
68b0: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e   {.      u32 ran
68c0: 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dom;.      sqlit
68d0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
68e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e        sqlite3Ran
68f0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
6900: 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29  andom), &random)
6910: 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20  ;.      zMaster 
6920: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
6930: 28 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d  ("%s-mj%08X", zM
6940: 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26  ainFile, random&
6950: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0x7fffffff);.   
6960: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
6970: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6980: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6990: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
69a0: 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  le( sqlite3OsFil
69b0: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
69c0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
69d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
69e0: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  nal. */.    mems
69f0: 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c 20 73  et(&master, 0, s
6a00: 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29 3b 0a  izeof(master));.
6a10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6a20: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
6a30: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
6a40: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
6a50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6a60: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6a70: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
6a80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
6a90: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
6aa0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
6ab0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
6ac0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
6ad0: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
6ae0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
6af0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
6b00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
6b10: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
6b20: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
6b30: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
6b40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
6b50: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
6b60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
6b70: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
6b80: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
6b90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
6ba0: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
6bb0: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
6bc0: 61 63 6b 20 69 6e 64 65 70 65 6e 64 61 6e 74 6c  ack independantl
6bd0: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
6be0: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
6bf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6c00: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
6c10: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
6c20: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
6c30: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29        if( i==1 )
6c40: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20   continue;   /* 
6c50: 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20  Ignore the TEMP 
6c60: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
6c70: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6c80: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6c90: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
6ca0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
6cb0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
6cc0: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
6cd0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
6ce0: 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20  if( zFile[0]==0 
6cf0: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
6d00: 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20  Ignore :memory: 
6d10: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
6d20: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6d30: 33 4f 73 57 72 69 74 65 28 26 6d 61 73 74 65 72  3OsWrite(&master
6d40: 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28  , zFile, strlen(
6d50: 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20  zFile)+1);.     
6d60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6d80: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
6d90: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
6da0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
6db0: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  lete(zMaster);. 
6dc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
6dd0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
6de0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
6df0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6e00: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20     }.    }...   
6e10: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
6e20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6e30: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74  . Before doing t
6e40: 68 69 73 2c 20 6f 70 65 6e 20 74 68 65 20 64 69  his, open the di
6e50: 72 65 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74  rectory.    ** t
6e60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6e70: 6c 20 66 69 6c 65 20 69 73 20 73 74 6f 72 65 20  l file is store 
6e80: 69 6e 20 73 6f 20 74 68 61 74 20 69 74 20 67 65  in so that it ge
6e90: 74 73 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20  ts synced too.. 
6ea0: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46     */.    zMainF
6eb0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
6ec0: 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d  eeGetDirname(db-
6ed0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
6ee0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ef0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 4d  OpenDirectory(zM
6f00: 61 69 6e 46 69 6c 65 2c 20 26 6d 61 73 74 65 72  ainFile, &master
6f10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
6f20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6f30: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
6f40: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
6f50: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
6f60: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
6f70: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
6f80: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
6f90: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
6fa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
6fb0: 79 6e 63 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ync(&master);.  
6fc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6fd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
6fe0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
6ff0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
7000: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
7010: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
7020: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7030: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
7040: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
7050: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
7060: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
7070: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
7080: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7090: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
70a0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
70b0: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
70c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
70d0: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
70e0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
70f0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
7100: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
7110: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
7120: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
7130: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
7140: 65 65 53 79 6e 63 28 29 2c 0a 20 20 20 20 2a 2a  eeSync(),.    **
7150: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
7160: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
7170: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7180: 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  file will be.   
7190: 20 2a 2a 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   ** orphaned. Bu
71a0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
71b0: 74 65 20 69 74 2c 20 69 6e 20 63 61 73 65 20 74  te it, in case t
71c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
71d0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6e 61  l.    ** file na
71e0: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
71f0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
7200: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
7210: 66 61 69 6c 75 72 65 0a 20 20 20 20 2a 2a 20 6f  failure.    ** o
7220: 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ccured..    */. 
7230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
7240: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
7250: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
7260: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7270: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26  .      if( pBt &
7280: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
7290: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
72a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
72b0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 70 42  ite3BtreeSync(pB
72c0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
72d0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
72e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
72f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7300: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20  se(&master);.   
7310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
7320: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
7340: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7350: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
7360: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
7370: 74 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  ter);..    /* De
7380: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
7390: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
73a0: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
73c0: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
73d0: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
73e0: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
73f0: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
7400: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
7410: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
7420: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
7430: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
7440: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d  lite3OsDelete(zM
7450: 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
7460: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
7470: 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  K );.    sqliteF
7480: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
7490: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
74a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
74b0: 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 7a  sSyncDirectory(z
74c0: 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
74d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
74e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
74f0: 73 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e 20 54  s is not good. T
7500: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7510: 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
7520: 64 65 6c 65 74 65 64 2c 20 62 75 74 0a 20 20 20  deleted, but.   
7530: 20 20 20 2a 2a 20 74 68 65 20 64 69 72 65 63 74     ** the direct
7540: 6f 72 79 20 73 79 6e 63 20 66 61 69 6c 65 64 2e  ory sync failed.
7550: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d   There is no com
7560: 70 6c 65 74 65 6c 79 20 73 61 66 65 20 63 6f 75  pletely safe cou
7570: 72 73 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  rse of.      ** 
7580: 61 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65 72 65  action from here
7590: 2e 20 54 68 65 20 69 6e 64 69 76 69 64 75 61 6c  . The individual
75a0: 20 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74 61 69   journals contai
75b0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
75c0: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65  e.      ** maste
75d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
75e0: 62 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  but there is no 
75f0: 77 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 69  way of knowing i
7600: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
7610: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
7620: 78 69 73 74 73 20 6e 6f 77 20 6f 72 20 69 66 20  xists now or if 
7630: 69 74 20 77 69 6c 6c 20 65 78 69 73 74 20 61 66  it will exist af
7640: 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ter the operatin
7650: 67 0a 20 20 20 20 20 20 2a 2a 20 73 79 73 74 65  g.      ** syste
7660: 6d 20 63 72 61 73 68 20 74 68 61 74 20 6d 61 79  m crash that may
7670: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73 79 6e   follow the fsyn
7680: 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 20  c() failure..   
7690: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
76a0: 72 74 28 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  rt(0);.      sql
76b0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
76c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
76d0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
76e0: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
76f0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
7700: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
7710: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
7720: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
7730: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
7740: 65 65 43 6f 6d 6d 69 74 28 29 20 61 72 65 20 6f  eeCommit() are o
7750: 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
7760: 73 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 0a 20  s and deleting. 
7770: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20     ** journals. 
7780: 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
7790: 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 20 74 68  s wrong while th
77a0: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
77b0: 77 65 20 64 6f 6e 27 74 0a 20 20 20 20 2a 2a 20  we don't.    ** 
77c0: 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
77d0: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
77e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
77f0: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
7800: 65 65 64 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  eed,.    ** but 
7810: 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
7820: 27 20 6a 6f 75 72 6e 61 6c 73 20 6d 61 79 20 62  ' journals may b
7830: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
7840: 52 65 74 75 72 6e 69 6e 67 20 61 6e 0a 20 20 20  Returning an.   
7850: 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 77   ** error code w
7860: 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
7870: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
7880: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
7890: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
78a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
78b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
78c0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
78e0: 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  eCommit(pBt);.  
78f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7900: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7910: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72  ./*.** Find ever
7920: 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65  y active VM othe
7930: 72 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64  r than pVdbe and
7940: 20 63 68 61 6e 67 65 20 69 74 73 20 73 74 61 74   change its stat
7950: 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64  us to.** aborted
7960: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
7970: 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73  when one VM caus
7980: 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75  es a rollback du
7990: 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f  e to an.** ON CO
79a0: 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20  NFLICT ROLLBACK 
79b0: 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d  clause (for exam
79c0: 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72  ple).  The other
79d0: 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20   VMs must be.** 
79e0: 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20  aborted so that 
79f0: 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65  they do not have
7a00: 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74   data rolled out
7a10: 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68   from underneath
7a20: 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67  .** them leading
7a30: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a   to a segfault..
7a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
7a50: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
7a60: 64 62 65 73 28 56 64 62 65 20 2a 70 56 64 62 65  dbes(Vdbe *pVdbe
7a70: 29 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65  ){.  Vdbe *pOthe
7a80: 72 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d  r;.  for(pOther=
7a90: 70 56 64 62 65 2d 3e 64 62 2d 3e 70 56 64 62 65  pVdbe->db->pVdbe
7aa0: 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74 68 65 72  ; pOther; pOther
7ab0: 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b  =pOther->pNext){
7ac0: 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 3d  .    if( pOther=
7ad0: 3d 70 56 64 62 65 20 29 20 63 6f 6e 74 69 6e 75  =pVdbe ) continu
7ae0: 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65  e;.    if( pOthe
7af0: 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  r->magic!=VDBE_M
7b00: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 4f 74 68  AGIC_RUN || pOth
7b10: 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f 6e 74 69  er->pc<0 ) conti
7b20: 6e 75 65 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c  nue;.    closeAl
7b30: 6c 43 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29  lCursors(pOther)
7b40: 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 61 62  ;.    pOther->ab
7b50: 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  orted = 1;.  }.}
7b60: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
7b70: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
7b80: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
7b90: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
7ba0: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
7bb0: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
7bc0: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
7bd0: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
7be0: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
7bf0: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
7c00: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
7c10: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
7c20: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
7c30: 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  atch..**.** This
7c40: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
7c50: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
7c60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
7c70: 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
7c80: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
7c90: 6e 74 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  nt(sqlite *db){.
7ca0: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
7cb0: 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 70 20 3d   cnt = 0;..  p =
7cc0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
7cd0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
7ce0: 28 20 28 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  ( (p->magic==VDB
7cf0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
7d00: 2d 3e 70 63 3e 3d 30 29 20 7c 7c 20 70 2d 3e 6d  ->pc>=0) || p->m
7d10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
7d20: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 20 20 63  _HALT ){.      c
7d30: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
7d40: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
7d50: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  }..  assert( cnt
7d60: 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ==db->activeVdbe
7d70: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
7d80: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
7d90: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
7da0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  dif../*.** Clean
7db0: 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
7dc0: 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
7dd0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
7de0: 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
7df0: 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
7e00: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
7e10: 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
7e20: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
7e30: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
7e40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7e50: 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
7e60: 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
7e70: 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
7e80: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73   again..*/.int s
7e90: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
7ea0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
7eb0: 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  te *db = p->db;.
7ec0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28    int i;.  int (
7ed0: 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70  *xFunc)(Btree *p
7ee0: 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e  Bt) = 0;  /* Fun
7ef0: 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e  ction to call on
7f00: 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b   each btree back
7f10: 65 6e 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  end */..  if( p-
7f20: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
7f30: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 6d 61 67  IC_RUN && p->mag
7f40: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic!=VDBE_MAGIC_H
7f50: 41 4c 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ALT ){.    sqlit
7f60: 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53  e3Error(p->db, S
7f70: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 30 20  QLITE_MISUSE, 0 
7f80: 2c 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ,0);.    return 
7f90: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
7fa0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72   }.  if( p->zErr
7fb0: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
7fc0: 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70  e3Error(p->db, p
7fd0: 2d 3e 72 63 2c 20 22 25 73 22 2c 20 70 2d 3e 7a  ->rc, "%s", p->z
7fe0: 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
7ff0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45  sqliteFree(p->zE
8000: 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
8010: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 65  ErrMsg = 0;.  }e
8020: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
8030: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8040: 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20  r(p->db, p->rc, 
8050: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
8060: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d   sqlite3Error(p-
8070: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  >db, SQLITE_OK, 
8080: 30 29 3b 0a 20 20 7d 0a 20 20 43 6c 65 61 6e 75  0);.  }.  Cleanu
8090: 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 57 68 61 74  p(p);..  /* What
80a0: 20 69 73 20 64 6f 6e 65 20 6e 6f 77 20 64 65 70   is done now dep
80b0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 65 78 69 74  ends on the exit
80c0: 20 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 76   status of the v
80d0: 64 62 65 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  dbe, the value o
80e0: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
80f0: 65 2e 61 75 74 6f 43 6f 6d 6d 69 74 20 66 6c 61  e.autoCommit fla
8100: 67 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72  g and whether or
8110: 20 6e 6f 74 20 74 68 65 72 65 20 61 72 65 20 61   not there are a
8120: 6e 79 20 6f 74 68 65 72 0a 20 20 2a 2a 20 71 75  ny other.  ** qu
8130: 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
8140: 73 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  s. A transaction
8150: 20 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 74 72   or statement tr
8160: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 65  ansaction may ne
8170: 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 6f  ed.  ** to be co
8180: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
8190: 64 20 62 61 63 6b 20 6f 6e 20 65 61 63 68 20 6f  d back on each o
81a0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
81b0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 41  e..  */.  checkA
81c0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
81d0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  ;.  if( db->auto
81e0: 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63  Commit && db->ac
81f0: 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29  tiveVdbeCnt==1 )
8200: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  {.    if( p->rc=
8210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
8220: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
8230: 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 2f  _Fail ){.      /
8240: 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
8250: 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
8260: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
8270: 65 72 20 61 63 74 69 76 65 20 71 75 65 72 69 65  er active querie
8280: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67  s.      ** using
8290: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 61 6e 64   this handle and
82a0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
82b0: 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
82c0: 20 6f 72 20 68 69 74 20 61 6e 0a 20 20 20 20 20   or hit an.     
82d0: 20 2a 2a 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   ** 'OR FAIL' co
82e0: 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d  nstraint. This m
82f0: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 69 73  eans a commit is
8300: 20 72 65 71 75 69 72 65 64 2c 20 77 68 69 63 68   required, which
8310: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e   is.      ** han
8320: 64 6c 65 64 20 61 20 6c 69 74 74 6c 65 20 64 69  dled a little di
8330: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
8340: 68 65 20 6f 74 68 65 72 20 6f 70 74 69 6f 6e 73  he other options
8350: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8360: 20 70 2d 3e 72 63 20 3d 20 76 64 62 65 43 6f 6d   p->rc = vdbeCom
8370: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20 69  mit(db);.      i
8380: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
8390: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
83a0: 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64  qlite3Error(p->d
83b0: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
83c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
83d0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
83e0: 70 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 4f 6e 20  p->autoCommitOn 
83f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
8400: 49 66 20 77 65 20 6a 75 73 74 20 6e 6f 77 20 68  If we just now h
8410: 61 76 65 20 74 75 72 6e 65 64 20 61 75 74 6f 63  ave turned autoc
8420: 6f 6d 6d 69 74 20 6f 6e 20 28 6d 65 61 6e 69 6e  ommit on (meanin
8430: 67 20 77 65 20 6a 75 73 74 20 68 61 76 65 0a 20  g we just have. 
8440: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6e 69           ** fini
8450: 73 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61  shed executing a
8460: 20 43 4f 4d 4d 49 54 20 63 6f 6d 6d 61 6e 64 29   COMMIT command)
8470: 20 62 75 74 20 74 68 65 20 63 6f 6d 6d 69 74 20   but the commit 
8480: 66 61 69 6c 73 20 64 75 65 0a 20 20 20 20 20 20  fails due.      
8490: 20 20 20 20 2a 2a 20 74 6f 20 6c 6f 63 6b 20 63      ** to lock c
84a0: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 61 75 74 6f 63  ontention, autoc
84b0: 6f 6d 6d 69 74 20 62 61 63 6b 20 6f 66 66 2e 20  ommit back off. 
84c0: 20 54 68 69 73 20 67 69 76 65 73 20 74 68 65 20   This gives the 
84d0: 75 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  user.          *
84e0: 2a 20 74 68 65 20 6f 70 70 6f 72 74 75 6e 69 74  * the opportunit
84f0: 79 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 61  y to try again a
8500: 66 74 65 72 20 74 68 65 20 6c 6f 63 6b 20 74 68  fter the lock th
8510: 61 74 20 77 61 73 20 70 72 65 76 65 6e 74 69 6e  at was preventin
8520: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  g.          ** t
8530: 68 65 20 63 6f 6d 6d 69 74 20 68 61 73 20 63 6c  he commit has cl
8540: 65 61 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  eared. */.      
8550: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
8560: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
8570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8580: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 61   /* If the comma
8590: 6e 64 20 6a 75 73 74 20 65 78 65 63 75 74 65 64  nd just executed
85a0: 20 77 61 73 20 6e 6f 74 20 61 20 43 4f 4d 4d 49   was not a COMMI
85b0: 54 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 0a  T command, then.
85c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c            ** rol
85d0: 6c 62 61 63 6b 20 77 68 61 74 65 76 65 72 20 74  lback whatever t
85e0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
85f0: 61 74 20 63 6f 6d 6d 61 6e 64 20 77 65 72 65 20  at command were 
8600: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 78 46 75  */.          xFu
8610: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
8620: 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  eRollback;.     
8630: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 46   }else{.      xF
8650: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
8660: 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  eeRollback;.    
8670: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
8680: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8690: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
86a0: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
86b0: 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20  {.      xFunc = 
86c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
86d0: 69 74 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73  itStmt;.    }els
86e0: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
86f0: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
8700: 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20  {.      xFunc = 
8710: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
8720: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 7d 65  backStmt;.    }e
8730: 6c 73 65 7b 0a 20 20 20 20 20 20 78 46 75 6e 63  lse{.      xFunc
8740: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
8750: 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 64  ollback;.      d
8760: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
8770: 31 3b 0a 20 20 20 20 20 20 61 62 6f 72 74 4f 74  1;.      abortOt
8780: 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28 70  herActiveVdbes(p
8790: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
87a0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 4f 6e 20 3d  ->autoCommitOn =
87b0: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 78 46 75   0;..  /* If xFu
87c0: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
87d0: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
87e0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
87f0: 6c 6c 62 61 63 6b 2c 0a 20 20 2a 2a 20 73 71 6c  llback,.  ** sql
8800: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
8810: 6b 53 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  kStmt or sqlite3
8820: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e  BtreeCommitStmt.
8830: 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e   Call it once on
8840: 0a 20 20 2a 2a 20 65 61 63 68 20 62 61 63 6b 65  .  ** each backe
8850: 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  nd. If an error 
8860: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 72  occurs and the r
8870: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74  eturn code is st
8880: 69 6c 6c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ill.  ** SQLITE_
8890: 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75  OK, set the retu
88a0: 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  rn code to the n
88b0: 65 77 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ew error value..
88c0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
88d0: 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e  xFunc && i<db->n
88e0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69  Db; i++){ .    i
88f0: 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65  nt rc;.    Btree
8900: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8910: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
8920: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  pBt ){.      rc 
8930: 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20  = xFunc(pBt);.  
8940: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
8950: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
8960: 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = rc;.    }.  }
8970: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77  ..  /* If this w
8980: 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
8990: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 2c 20  DATE or DELETE, 
89a0: 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20 63  set the change c
89b0: 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 69 66 28  ounter. */.  if(
89c0: 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
89d0: 29 7b 0a 20 20 20 20 69 66 28 20 21 78 46 75 6e  ){.    if( !xFun
89e0: 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69  c || xFunc==sqli
89f0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
8a00: 6d 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mt ){.      sqli
8a10: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
8a20: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
8a30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8a40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8a50: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
8a60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
8a70: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  Change = 0;.  }.
8a80: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
8a90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
8aa0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e  qlite3RollbackIn
8ab0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
8ac0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  );.  }else if( d
8ad0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8ae0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
8af0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
8b00: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
8b10: 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ges(db);.  }..  
8b20: 69 66 28 20 28 70 2d 3e 6d 61 67 69 63 3d 3d 56  if( (p->magic==V
8b30: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
8b40: 20 70 2d 3e 70 63 3e 3d 30 29 20 7c 7c 20 70 2d   p->pc>=0) || p-
8b50: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
8b60: 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 64  IC_HALT ){.    d
8b70: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
8b80: 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  --;.  }..  asser
8b90: 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61  t( p->pTos<&p->a
8ba0: 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a  Stack[p->pc<0?0:
8bb0: 70 2d 3e 70 63 5d 20 7c 7c 20 73 71 6c 69 74 65  p->pc] || sqlite
8bc0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3d  3_malloc_failed=
8bd0: 3d 31 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42  =1 );.#ifdef VDB
8be0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
8bf0: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
8c00: 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
8c10: 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
8c20: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
8c30: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
8c40: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
8c50: 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
8c60: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
8c70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
8c80: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
8c90: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
8ca0: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
8cb0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
8cc0: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
8cd0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
8ce0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
8cf0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
8d00: 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
8d10: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
8d20: 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
8d30: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
8d40: 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
8d50: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
8d60: 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
8d70: 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
8d80: 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
8d90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8da0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
8db0: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
8dc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8dd0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
8de0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
8df0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
8e00: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70  _MAGIC_INIT;.  p
8e10: 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20  ->aborted = 0;. 
8e20: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
8e30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
8e40: 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
8e50: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
8e60: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
8e70: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
8e80: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
8e90: 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
8ea0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
8eb0: 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
8ec0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8ed0: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
8ee0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
8ef0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
8f00: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64  qlite *db = p->d
8f10: 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  b;..  if( p->mag
8f20: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
8f30: 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
8f40: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
8f50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8f60: 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
8f70: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
8f80: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
8f90: 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 2f 2a  C_INIT ){.    /*
8fa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d   sqlite3Error(p-
8fb0: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55  >db, SQLITE_MISU
8fc0: 53 45 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 72  SE, 0); */.    r
8fd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
8fe0: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
8ff0: 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
9000: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9010: 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20 20  E_SCHEMA ){.    
9020: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
9030: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
9040: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9050: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  rc;.}../*.** Cal
9060: 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  l the destructor
9070: 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74   for each auxdat
9080: 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65  a entry in pVdbe
9090: 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a  Func for which.*
90a0: 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
90b0: 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20  ing bit in mask 
90c0: 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61  is clear.  Auxda
90d0: 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e  ta entries beyon
90e0: 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61  d 31.** are alwa
90f0: 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54  ys destroyed.  T
9100: 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75  o destroy all au
9110: 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63  xdata entries, c
9120: 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  all this.** rout
9130: 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30  ine with mask==0
9140: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9150: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
9160: 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64  ta(VdbeFunc *pVd
9170: 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b  beFunc, int mask
9180: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
9190: 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75  r(i=0; i<pVdbeFu
91a0: 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a  nc->nAux; i++){.
91b0: 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61      struct AuxDa
91c0: 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62  ta *pAux = &pVdb
91d0: 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b  eFunc->apAux[i];
91e0: 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c  .    if( (i>31 |
91f0: 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29  | !(mask&(1<<i))
9200: 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20  ) && pAux->pAux 
9210: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  ){.      if( pAu
9220: 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
9230: 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
9240: 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
9250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9260: 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  Aux->pAux = 0;. 
9270: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9280: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
9290: 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
92a0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
92b0: 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  te(Vdbe *p){.  i
92c0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
92d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65   ) return;.  Cle
92e0: 61 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70  anup(p);.  if( p
92f0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
9300: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
9310: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
9320: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9330: 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  p->db->pVdbe==p 
9340: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56  );.    p->db->pV
9350: 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
9360: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
9370: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
9380: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
9390: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  Prev;.  }.  p->p
93a0: 50 72 65 76 20 3d 20 70 2d 3e 70 4e 65 78 74 20  Prev = p->pNext 
93b0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  = 0;.  if( p->nO
93c0: 70 41 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  pAlloc==0 ){.   
93d0: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20   p->aOp = 0;.   
93e0: 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 7d   p->nOp = 0;.  }
93f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
9400: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
9410: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
9420: 70 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f  p[i];.    if( pO
9430: 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44 59  p->p3type==P3_DY
9440: 4e 41 4d 49 43 20 7c 7c 20 70 4f 70 2d 3e 70 33  NAMIC || pOp->p3
9450: 74 79 70 65 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f  type==P3_KEYINFO
9460: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9470: 46 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20  Free(pOp->p3);. 
9480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
9490: 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 56 44 42  ->p3type==P3_VDB
94a0: 45 46 55 4e 43 20 29 7b 0a 20 20 20 20 20 20 56  EFUNC ){.      V
94b0: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
94c0: 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a  nc = (VdbeFunc *
94d0: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
94e0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
94f0: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
9500: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  nc, 0);.      sq
9510: 6c 69 74 65 46 72 65 65 28 70 56 64 62 65 46 75  liteFree(pVdbeFu
9520: 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nc);.    }.  }. 
9530: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9540: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Var; i++){.    s
9550: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
9560: 65 61 73 65 28 26 70 2d 3e 61 70 56 61 72 5b 69  ease(&p->apVar[i
9570: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
9580: 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  Free(p->aOp);.  
9590: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c  sqliteFree(p->aL
95a0: 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46  abel);.  sqliteF
95b0: 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a  ree(p->aStack);.
95c0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
95d0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
95e0: 3b 20 69 3c 28 70 2d 3e 6e 52 65 73 43 6f 6c 75  ; i<(p->nResColu
95f0: 6d 6e 29 2a 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  mn)*2; i++){.   
9600: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
9610: 6d 52 65 6c 65 61 73 65 28 26 28 70 2d 3e 61 43  mRelease(&(p->aC
9620: 6f 6c 4e 61 6d 65 5b 69 5d 29 29 3b 0a 20 20 20  olName[i]));.   
9630: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
9640: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
9650: 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
9660: 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
9670: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
9680: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  );.}../*.** If a
9690: 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
96a0: 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
96b0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
96c0: 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
96d0: 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52  * MoveTo now.  R
96e0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
96f0: 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65  ode.  If no Move
9700: 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74  To is pending, t
9710: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
9720: 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20  oes nothing and 
9730: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
9740: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
9750: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
9760: 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  o(Cursor *p){.  
9770: 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
9780: 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
9790: 20 72 65 73 3b 0a 20 20 20 20 65 78 74 65 72 6e   res;.    extern
97a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
97b0: 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61  rch_count;.    a
97c0: 73 73 65 72 74 28 20 70 2d 3e 69 6e 74 4b 65 79  ssert( p->intKey
97d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   );.    if( p->i
97e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 73  ntKey ){.      s
97f0: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
9800: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
9810: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
9820: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , &res);.    }el
9830: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9840: 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e  3BtreeMoveto(p->
9850: 70 43 75 72 73 6f 72 2c 28 63 68 61 72 2a 29 26  pCursor,(char*)&
9860: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
9870: 73 69 7a 65 6f 66 28 69 36 34 29 2c 26 72 65 73  sizeof(i64),&res
9880: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 2d  );.    }.    *p-
9890: 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20  >pIncrKey = 0;. 
98a0: 20 20 20 70 2d 3e 6c 61 73 74 52 65 63 6e 6f 20     p->lastRecno 
98b0: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
98c0: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
98d0: 20 70 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69 64   p->recnoIsValid
98e0: 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69   = res==0;.    i
98f0: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
9900: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65    sqlite3BtreeNe
9910: 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  xt(p->pCursor, &
9920: 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  res);.    }.    
9930: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
9940: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64  ount++;.    p->d
9950: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
9960: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 56  0;.    p->cacheV
9970: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  alid = 0;.  }.  
9980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
99a0: 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
99b0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
99c0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
99d0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
99e0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
99f0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
9a00: 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71  rialRead().** sq
9a10: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
9a20: 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
9a30: 64 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29  dbeSerialWrite()
9a40: 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
9a50: 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
9a60: 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
9a70: 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
9a80: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
9a90: 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
9aa0: 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
9ab0: 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
9ac0: 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
9ad0: 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
9ae0: 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
9af0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
9b00: 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
9b10: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
9b20: 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
9b30: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
9b40: 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
9b50: 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
9b60: 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
9b70: 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
9b80: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
9b90: 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
9ba0: 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
9bb0: 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
9bc0: 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
9bd0: 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
9be0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
9bf0: 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
9c00: 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
9c10: 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
9c20: 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
9c30: 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
9c40: 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
9c50: 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
9c60: 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
9c70: 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
9c80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
9c90: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
9ca0: 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
9cb0: 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
9cc0: 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
9cd0: 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
9ce0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
9cf0: 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
9d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
9d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
9d20: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
9d30: 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
9d60: 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
9d90: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
9da0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
9db0: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
9dc0: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
9dd0: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
9e00: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
9e10: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
9e40: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
9e50: 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
9e60: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
9e70: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
9e80: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
9eb0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
9ec0: 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
9ee0: 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
9ef0: 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 38 2d 31 31  loat.**     8-11
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f20: 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
9f30: 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
9f40: 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
9f50: 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
9f60: 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
9f70: 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
9f80: 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
9f90: 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a    text.**.*/../*
9fa0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
9fb0: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
9fc0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
9fd0: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
9fe0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
9ff0: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29  lType(Mem *pMem)
a000: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
a010: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20  pMem->flags;..  
a020: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
a030: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
a040: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
a050: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
a060: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
a070: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
a080: 31 2c 20 32 2c 20 34 20 6f 72 20 38 20 62 79 74  1, 2, 4 or 8 byt
a090: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  es. */.    i64 i
a0a0: 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20   = pMem->i;.    
a0b0: 69 66 28 20 69 3e 3d 2d 31 32 37 20 26 26 20 69  if( i>=-127 && i
a0c0: 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
a0d0: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 33 32  ;.    if( i>=-32
a0e0: 37 36 37 20 26 26 20 69 3c 3d 33 32 37 36 37 20  767 && i<=32767 
a0f0: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
a100: 69 66 28 20 69 3e 3d 2d 38 33 38 38 36 30 37 20  if( i>=-8388607 
a110: 26 26 20 69 3c 3d 38 33 38 38 36 30 37 20 29 20  && i<=8388607 ) 
a120: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
a130: 28 20 69 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( i>=-2147483647
a140: 20 26 26 20 69 3c 3d 32 31 34 37 34 38 33 36 34   && i<=214748364
a150: 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
a160: 20 20 69 66 28 20 69 3e 3d 2d 31 34 30 37 33 37    if( i>=-140737
a170: 34 38 38 33 35 35 33 32 38 4c 20 26 26 20 69 3c  488355328L && i<
a180: 3d 31 34 30 37 33 37 34 38 38 33 35 35 33 32 38  =140737488355328
a190: 4c 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  L ) return 5;.  
a1a0: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
a1b0: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
a1c0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
a1d0: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 7;.  }.  if( 
a1e0: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
a1f0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4d 65  .    int n = pMe
a200: 6d 2d 3e 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  m->n;.    assert
a210: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 72 65  ( n>=0 );.    re
a220: 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 33  turn ((n*2) + 13
a230: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  );.  }.  if( fla
a240: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
a250: 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d     return (pMem-
a260: 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a  >n*2 + 12);.  }.
a270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
a280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
a290: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
a2a0: 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
a2b0: 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
a2c0: 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
a2d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
a2e0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
a2f0: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
a300: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
a310: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
a320: 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
a330: 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
a340: 0a 20 20 20 20 73 74 61 74 69 63 20 75 38 20 61  .    static u8 a
a350: 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  Size[] = { 0, 1,
a360: 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20   2, 3, 4, 6, 8, 
a370: 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  8, 0, 0, 0, 0 };
a380: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a  .    return aSiz
a390: 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  e[serial_type];.
a3a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69    }.}../*.** Wri
a3b0: 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
a3c0: 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
a3d0: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
a3e0: 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
a3f0: 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
a400: 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
a410: 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
a420: 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
a430: 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
a440: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a450: 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a  es written..*/ .
a460: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
a470: 65 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e 65  erialPut(unsigne
a480: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 4d 65 6d  d char *buf, Mem
a490: 20 2a 70 4d 65 6d 29 7b 0a 20 20 75 33 32 20 73   *pMem){.  u32 s
a4a0: 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c  erial_type = sql
a4b0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
a4c0: 70 65 28 70 4d 65 6d 29 3b 0a 20 20 69 6e 74 20  pe(pMem);.  int 
a4d0: 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  len;..  /* NULL 
a4e0: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
a4f0: 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  type==0 ){.    r
a500: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 0a 20  eturn 0;.  }. . 
a510: 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
a520: 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
a530: 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 29 7b 0a  rial_type<=7 ){.
a540: 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69      u64 v;.    i
a550: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  nt i;.    if( se
a560: 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
a570: 20 20 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a        v = *(u64*
a580: 29 26 70 4d 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d  )&pMem->r;.    }
a590: 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
a5a0: 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b  *(u64*)&pMem->i;
a5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
a5c0: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
a5d0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
a5e0: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
a5f0: 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
a600: 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26      buf[i] = (v&
a610: 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
a620: 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >= 8;.    }.    
a630: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
a640: 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f    .  /* String o
a650: 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73 65  r blob */.  asse
a660: 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  rt( serial_type>
a670: 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20 73  =12 );.  len = s
a680: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
a690: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
a6a0: 79 70 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 62  ype);.  memcpy(b
a6b0: 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
a6c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  );.  return len;
a6d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
a6e0: 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
a6f0: 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
a700: 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
a710: 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
a720: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
a730: 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
a740: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
a750: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
a760: 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ad..*/ .int sqli
a770: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
a780: 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
a790: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
a7a0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
a7b0: 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
a7c0: 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
a7d0: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
a7e0: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
a7f0: 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
a800: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
a830: 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
a840: 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69  e into */.){.  i
a850: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 69 66 28 20 73  nt len;..  if( s
a860: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
a870: 0a 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  .    /* NULL */.
a880: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a890: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
a8a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a8b0: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62  len = sqlite3Vdb
a8c0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
a8d0: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
a8e0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
a8f0: 37 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 74 65  7 ){.    /* Inte
a900: 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
a910: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
a920: 79 70 65 3c 3d 34 20 29 7b 0a 20 20 20 20 20 20  ype<=4 ){.      
a930: 2f 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  /* 32-bit intege
a940: 72 20 74 79 70 65 2e 20 20 54 68 69 73 20 69 73  r type.  This is
a950: 20 68 61 6e 64 6c 65 64 20 62 79 20 61 20 73 70   handled by a sp
a960: 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 0a 20  ecial case for. 
a970: 20 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61       ** performa
a980: 6e 63 65 20 72 65 61 73 6f 6e 73 2e 20 2a 2f 0a  nce reasons. */.
a990: 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 62 75        int v = bu
a9a0: 66 5b 30 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  f[0];.      int 
a9b0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 76 26 30  n;.      if( v&0
a9c0: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76  x80 ){.        v
a9d0: 20 7c 3d 20 2d 32 35 36 3b 0a 20 20 20 20 20 20   |= -256;.      
a9e0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b  }.      for(n=1;
a9f0: 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20   n<len; n++){.  
aa00: 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 38 29        v = (v<<8)
aa10: 20 7c 20 62 75 66 5b 6e 5d 3b 0a 20 20 20 20 20   | buf[n];.     
aa20: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
aa30: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
aa40: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
aa50: 76 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  v;.      return 
aa60: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
aa70: 20 20 20 20 75 36 34 20 76 20 3d 20 30 3b 0a 20      u64 v = 0;. 
aa80: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20       int n;..   
aa90: 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78     if( buf[0]&0x
aaa0: 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20  80 ){.        v 
aab0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
aac0: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6c      for(n=0; n<l
aad0: 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  en; n++){.      
aae0: 20 20 76 20 3d 20 28 76 3c 3c 38 29 20 7c 20 62    v = (v<<8) | b
aaf0: 75 66 5b 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  uf[n];.      }. 
ab00: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
ab10: 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
ab20: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ab30: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
ab40: 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64     pMem->r = *(d
ab50: 6f 75 62 6c 65 2a 29 26 76 3b 0a 20 20 20 20 20  ouble*)&v;.     
ab60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ab70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
ab80: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  M_Int;.        p
ab90: 4d 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29  Mem->i = *(i64*)
aba0: 26 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  &v;.      }.    
abb0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
abc0: 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
abd0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
abe0: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
abf0: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  );.    pMem->z =
ac00: 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
ac10: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
ac20: 0a 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20  .    pMem->xDel 
ac30: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 65 72  = 0;.    if( ser
ac40: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
ac50: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
ac60: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
ac70: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d 65  EM_Ephem;.    }e
ac80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  lse{.      pMem-
ac90: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
aca0: 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
acb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
acc0: 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n len;.}../*.** 
acd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
ace0: 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
acf0: 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
ad00: 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69  ex records speci
ad10: 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65  fied by .** {nKe
ad20: 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b  y1, pKey1} and {
ad30: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72  nKey2, pKey2}, r
ad40: 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74  eturning a negat
ad50: 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
ad60: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
ad70: 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   if {nKey1, pKey
ad80: 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  1} is less than,
ad90: 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
ada0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e   greater than {n
adb0: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42  Key2, pKey2}.  B
adc0: 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  oth Key1 and Key
add0: 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73  2 must be byte s
ade0: 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73  trings.** compos
adf0: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
ae00: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
ae10: 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69  f the VDBE..*/.i
ae20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
ae30: 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76  cordCompare(.  v
ae40: 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20  oid *userData,. 
ae50: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
ae60: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a  t void *pKey1, .
ae70: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
ae80: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
ae90: 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  {.  KeyInfo *pKe
aea0: 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f  yInfo = (KeyInfo
aeb0: 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33  *)userData;.  u3
aec0: 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20  2 d1, d2;       
aed0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
aee0: 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
aef0: 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
af00: 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78  .  u32 idx1, idx
af10: 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  2;      /* Offse
af20: 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
af30: 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
af40: 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
af50: 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f  Hdr1, szHdr2;  /
af60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
af70: 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
af80: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
af90: 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
afa0: 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
afb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
afc0: 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
afd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
afe0: 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ey1;.  const uns
aff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
b000: 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  2 = (const unsig
b010: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32  ned char *)pKey2
b020: 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20  ;..  Mem mem1;. 
b030: 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d   Mem mem2;.  mem
b040: 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
b050: 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e  ->enc;.  mem2.en
b060: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
b070: 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 73  c;.  .  idx1 = s
b080: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
b090: 32 28 70 4b 65 79 31 2c 20 26 73 7a 48 64 72 31  2(pKey1, &szHdr1
b0a0: 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
b0b0: 3b 0a 20 20 69 64 78 32 20 3d 20 73 71 6c 69 74  ;.  idx2 = sqlit
b0c0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b  e3GetVarint32(pK
b0d0: 65 79 32 2c 20 26 73 7a 48 64 72 32 29 3b 0a 20  ey2, &szHdr2);. 
b0e0: 20 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20   d2 = szHdr2;.  
b0f0: 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
b100: 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69  o->nField;.  whi
b110: 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
b120: 26 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29  && idx2<szHdr2 )
b130: 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
b140: 5f 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20  _type1;.    u32 
b150: 73 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20  serial_type2;.. 
b160: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
b170: 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
b180: 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
b190: 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
b1a0: 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c  .    idx1 += sql
b1b0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
b1c0: 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 26 73  &aKey1[idx1], &s
b1d0: 65 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20  erial_type1);.  
b1e0: 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
b1f0: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
b200: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
b210: 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
b220: 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d  eak;.    idx2 +=
b230: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
b240: 74 33 32 28 26 61 4b 65 79 32 5b 69 64 78 32 5d  t32(&aKey2[idx2]
b250: 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29  , &serial_type2)
b260: 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b  ;.    if( d2>=nK
b270: 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey2 && sqlite3Vd
b280: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
b290: 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20  serial_type2)>0 
b2a0: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
b2b0: 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
b2c0: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
b2d0: 63 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68 20  ce left in each 
b2e0: 6b 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f 62  key for the blob
b2f0: 20 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20   of.    ** data 
b300: 74 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20 73  to go with the s
b310: 65 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74 20  erial type just 
b320: 72 65 61 64 2e 20 54 68 69 73 20 61 73 73 65 72  read. This asser
b330: 74 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 20  t may fail if.  
b340: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73    ** the file is
b350: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
b360: 6e 20 72 65 61 64 20 74 68 65 20 76 61 6c 75 65  n read the value
b370: 20 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 69   from each key i
b380: 6e 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20  nto mem1.    ** 
b390: 61 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63 74  and mem2 respect
b3a0: 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ively..    */.  
b3b0: 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
b3c0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
b3d0: 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
b3e0: 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20  type1, &mem1);. 
b3f0: 20 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33     d2 += sqlite3
b400: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
b410: 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c  Key2[d2], serial
b420: 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a  _type2, &mem2);.
b430: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b440: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
b450: 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65  1, &mem2, i<nFie
b460: 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ld ? pKeyInfo->a
b470: 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
b480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b490: 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a  Release(&mem1);.
b4a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b4b0: 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29  emRelease(&mem2)
b4c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
b4d0: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
b4e0: 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
b4f0: 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20   }..  /* One of 
b500: 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
b510: 20 6f 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20   of fields, but 
b520: 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
b530: 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a  p to that point.
b540: 20 20 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e    ** were equal.
b550: 20 49 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20   If the incrKey 
b560: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
b570: 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65  en the second ke
b580: 79 20 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65  y is.  ** treate
b590: 64 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a  d as larger..  *
b5a0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  /.  if( rc==0 ){
b5b0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66  .    if( pKeyInf
b5c0: 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20  o->incrKey ){.  
b5d0: 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
b5e0: 20 7d 65 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b   }else if( d1<nK
b5f0: 65 79 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ey1 ){.      rc 
b600: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
b610: 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20  f( d2<nKey2 ){. 
b620: 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
b630: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
b640: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
b650: 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66  der && i<pKeyInf
b660: 6f 2d 3e 6e 46 69 65 6c 64 20 26 26 20 70 4b 65  o->nField && pKe
b670: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
b680: 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[i] ){.    rc =
b690: 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   -rc;.  }..  ret
b6a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b6b0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
b6c0: 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
b6d0: 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74  composed using t
b6e0: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
b6f0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20   opcode..** The 
b700: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
b710: 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  is record should
b720: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28   be an integer (
b730: 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20  specifically.** 
b740: 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64  an integer rowid
b750: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
b760: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
b770: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a  ber of bytes in.
b780: 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e  ** that integer.
b790: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
b7a0: 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 69  dbeIdxRowidLen(i
b7b0: 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75  nt nKey, const u
b7c0: 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
b7d0: 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
b7e0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
b7f0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
b800: 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
b810: 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
b820: 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c   rowid */..  sql
b830: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
b840: 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20  aKey, &szHdr);. 
b850: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
b860: 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d  t32(&aKey[szHdr-
b870: 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b  1], &typeRowid);
b880: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b890: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
b8a0: 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d  en(typeRowid);.}
b8b0: 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  .  ../*.** pCur 
b8c0: 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
b8d0: 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
b8e0: 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
b8f0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
b900: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
b910: 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
b920: 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
b930: 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
b940: 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
b950: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b960: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b970: 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
b980: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
b990: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
b9a0: 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73  eIdxRowid(BtCurs
b9b0: 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
b9c0: 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
b9d0: 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b  llKey;.  int rc;
b9e0: 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
b9f0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
ba00: 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
ba10: 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
ba20: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
ba30: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
ba40: 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
ba50: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
ba60: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
ba70: 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
ba80: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
ba90: 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
baa0: 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
bab0: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
bac0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bad0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bae0: 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
baf0: 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 6e 43  tree(pCur, 0, nC
bb00: 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
bb10: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
bb20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
bb30: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
bb40: 74 33 32 28 6d 2e 7a 2c 20 26 73 7a 48 64 72 29  t32(m.z, &szHdr)
bb50: 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  ;.  sqlite3GetVa
bb60: 72 69 6e 74 33 32 28 26 6d 2e 7a 5b 73 7a 48 64  rint32(&m.z[szHd
bb70: 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
bb80: 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
bb90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
bba0: 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
bbb0: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
bbc0: 62 65 53 65 72 69 61 6c 47 65 74 28 26 6d 2e 7a  beSerialGet(&m.z
bbd0: 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
bbe0: 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
bbf0: 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 69 3b 0a    *rowid = v.i;.
bc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
bc10: 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
bc20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
bc40: 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
bc50: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
bc60: 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
bc70: 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a  oint to against.
bc80: 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
bc90: 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65  g in pKey (of le
bca0: 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69  ngth nKey).  Wri
bcb0: 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
bcc0: 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
bcd0: 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
bce0: 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
bcf0: 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
bd00: 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
bd10: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
bd20: 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Key.  Return SQL
bd30: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
bd40: 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73  s..**.** pKey is
bd50: 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
bd60: 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
bd70: 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
bd80: 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
bd90: 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
bda0: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
bdb0: 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
bdc0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
bdd0: 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
bde0: 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74   as well..*/.int
bdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
be00: 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72  eyCompare(.  Cur
be10: 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
be20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
be30: 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
be40: 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69  e against */.  i
be50: 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75  nt nKey, const u
be60: 38 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68  8 *pKey,   /* Th
be70: 65 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65  e key to compare
be80: 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
beb0: 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
bec0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
bed0: 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e  4 nCellKey;.  in
bee0: 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
bef0: 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
bf00: 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52  rsor;.  int lenR
bf10: 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  owid;.  Mem m;..
bf20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
bf30: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
bf40: 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43  llKey);.  if( nC
bf50: 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20  ellKey<=0 ){.   
bf60: 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
bf70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bf80: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
bf90: 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
bfa0: 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ree(pC->pCursor,
bfb0: 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
bfc0: 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
bfd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
bfe0: 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
bff0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  = sqlite3VdbeIdx
c000: 52 6f 77 69 64 4c 65 6e 28 6d 2e 6e 2c 20 6d 2e  RowidLen(m.n, m.
c010: 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c  z);.  *res = sql
c020: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
c030: 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e  mpare(pC->pKeyIn
c040: 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  fo, m.n-lenRowid
c050: 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65  , m.z, nKey, pKe
c060: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  y);.  sqlite3Vdb
c070: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
c080: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c090: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
c0a0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
c0b0: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
c0c0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
c0d0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
c0e0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
c0f0: 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
c100: 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
c110: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
c120: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
c130: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
c140: 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 64 62  t nChange){.  db
c150: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
c160: 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
c170: 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
c180: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
c190: 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
c1a0: 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
c1b0: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
c1c0: 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
c1d0: 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
c1e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
c1f0: 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
c200: 65 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  es(Vdbe *p){.  p
c210: 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
c220: 31 3b 0a 7d 0a                                   1;.}.