/ Hex Artifact Content
Login

Artifact 4cd7291c34ff21079d4ddd62df4390b8bc22d1fb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 5f 76 6d 22 20 61 73 20 69  "sqlite_vm" as i
01e0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  t is known to th
01f0: 65 20 6f 75 74 73 69 64 65 20 77 6f 72 6c 64 2e  e outside world.
0200: 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 6f 20 76  )  Prior.** to v
0210: 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c 20 61 6c  ersion 2.8.7, al
0220: 6c 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  l this code was 
0230: 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
0240: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
0250: 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 74 68 61  file..** But tha
0260: 74 20 66 69 6c 65 20 77 61 73 20 67 65 74 74 69  t file was getti
0270: 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f 20 74 68  ng too big so th
0280: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  is subroutines w
0290: 65 72 65 20 73 70 6c 69 74 20 6f 75 74 2e 0a 2a  ere split out..*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02d0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63  e <ctype.h>.#inc
02e0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65  .../*.** When de
0300: 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65  bugging the code
0310: 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20   generator in a 
0320: 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65  symbolic debugge
0330: 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65  r, one can.** se
0340: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 64  t the sqlite3_vd
0350: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 74  be_addop_trace t
0360: 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f  o 1 and all opco
0370: 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e  des will be prin
0380: 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61  ted.** as they a
0390: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
03a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65  instruction stre
03b0: 61 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  am..*/.#ifndef N
03c0: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
03d0: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
03e0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0400: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
0410: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0420: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0430: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 20 2a  eCreate(sqlite *
0440: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
0450: 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c    p = sqliteMall
0460: 6f 63 28 20 73 69 7a 65 6f 66 28 56 64 62 65 29  oc( sizeof(Vdbe)
0470: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
0480: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e   return 0;.  p->
0490: 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64  db = db;.  if( d
04a0: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
04b0: 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76  db->pVdbe->pPrev
04c0: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70   = p;.  }.  p->p
04d0: 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65  Next = db->pVdbe
04e0: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
04f0: 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20  ;.  db->pVdbe = 
0500: 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  p;.  p->magic = 
0510: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
0520: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0530: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69  /*.** Turn traci
0540: 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a  ng on or off.*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46  Trace(Vdbe *p, F
0570: 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70  ILE *trace){.  p
0580: 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b  ->trace = trace;
0590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
05a0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
05b0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
05c0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
05d0: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
05e0: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
05f0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
0600: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
0610: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
0620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
0630: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
0640: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
0650: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
0660: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
0670: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
0680: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
0690: 20 70 31 2c 20 70 32 20 20 20 20 20 20 20 20 20   p1, p2         
06a0: 20 46 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68   First two of th
06b0: 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
06c0: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   operands..**.**
06d0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
06e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
06f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0700: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0710: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0720: 56 64 62 65 43 68 61 6e 67 65 50 33 28 29 20 66  VdbeChangeP3() f
0730: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0740: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0750: 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P3.** operand
0760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0770: 56 64 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a  VdbeAddOp(Vdbe *
0780: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0790: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  1, int p2){.  in
07a0: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
07b0: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
07c0: 70 3b 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20  p;.  p->nOp++;. 
07d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
07e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
07f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
0800: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20  ->nOpAlloc ){.  
0810: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0820: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20  p->nOpAlloc;.   
0830: 20 4f 70 20 2a 61 4e 65 77 3b 0a 20 20 20 20 70   Op *aNew;.    p
0840: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ->nOpAlloc = p->
0850: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30  nOpAlloc*2 + 100
0860: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
0870: 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f  iteRealloc(p->aO
0880: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73  p, p->nOpAlloc*s
0890: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20  izeof(Op));.    
08a0: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
08b0: 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63       p->nOpAlloc
08c0: 20 3d 20 6f 6c 64 53 69 7a 65 3b 0a 20 20 20 20   = oldSize;.    
08d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
08e0: 7d 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 61  }.    p->aOp = a
08f0: 4e 65 77 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  New;.    memset(
0900: 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d  &p->aOp[oldSize]
0910: 2c 20 30 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  , 0, (p->nOpAllo
0920: 63 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f  c-oldSize)*sizeo
0930: 66 28 4f 70 29 29 3b 0a 20 20 7d 0a 20 20 70 4f  f(Op));.  }.  pO
0940: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
0950: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
0960: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20  op;.  pOp->p1 = 
0970: 70 31 3b 0a 20 20 69 66 28 20 70 32 3c 30 20 26  p1;.  if( p2<0 &
0980: 26 20 28 2d 31 2d 70 32 29 3c 70 2d 3e 6e 4c 61  & (-1-p2)<p->nLa
0990: 62 65 6c 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  bel && p->aLabel
09a0: 5b 2d 31 2d 70 32 5d 3e 3d 30 20 29 7b 0a 20 20  [-1-p2]>=0 ){.  
09b0: 20 20 70 32 20 3d 20 70 2d 3e 61 4c 61 62 65 6c    p2 = p->aLabel
09c0: 5b 2d 31 2d 70 32 5d 3b 0a 20 20 7d 0a 20 20 70  [-1-p2];.  }.  p
09d0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
09e0: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f  Op->p3 = 0;.  pO
09f0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e  p->p3type = P3_N
0a00: 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64 65 66 20  OTUSED;.#ifndef 
0a10: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c  NDEBUG.  if( sql
0a20: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
0a30: 74 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56  trace ) sqlite3V
0a40: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
0a50: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65   &p->aOp[i]);.#e
0a60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b  ndif.  return i;
0a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
0a80: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
0a90: 6c 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c  ludes the p3 val
0aa0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
0ab0: 65 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a  e3VdbeOp3(Vdbe *
0ac0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0ad0: 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74  1, int p2, const
0ae0: 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20   char *zP3, int 
0af0: 70 33 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61  p3type){.  int a
0b00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
0b10: 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31  eAddOp(p, op, p1
0b20: 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p2);.  sqlite3
0b30: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20  VdbeChangeP3(p, 
0b40: 61 64 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70  addr, zP3, p3typ
0b50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
0b60: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
0b70: 6d 75 6c 74 69 70 6c 65 20 6f 70 63 6f 64 65 73  multiple opcodes
0b80: 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
0b90: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 6e 20  erminated by an 
0ba0: 6f 70 63 6f 64 65 20 6f 66 20 30 2e 0a 2a 2f 0a  opcode of 0..*/.
0bb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
0bc0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 2e 2e 2e  ode(Vdbe *p, ...
0bd0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
0be0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
0bf0: 6e 74 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 70  nt opcode, p1, p
0c00: 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  2;.  va_start(ap
0c10: 2c 20 70 29 3b 0a 20 20 61 64 64 72 20 3d 20 70  , p);.  addr = p
0c20: 2d 3e 6e 4f 70 3b 0a 20 20 77 68 69 6c 65 28 20  ->nOp;.  while( 
0c30: 28 6f 70 63 6f 64 65 20 3d 20 76 61 5f 61 72 67  (opcode = va_arg
0c40: 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 7b 0a  (ap,int))!=0 ){.
0c50: 20 20 20 20 70 31 20 3d 20 76 61 5f 61 72 67 28      p1 = va_arg(
0c60: 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 70 32 20  ap,int);.    p2 
0c70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
0c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0c90: 65 41 64 64 4f 70 28 70 2c 20 6f 70 63 6f 64 65  eAddOp(p, opcode
0ca0: 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 7d 0a 20  , p1, p2);.  }. 
0cb0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
0cc0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 0a  eturn addr;.}...
0cd0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0ce0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
0cf0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
0d00: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
0d10: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
0d20: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
0d30: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
0d40: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
0d50: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
0d60: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
0d70: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
0d80: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
0d90: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
0da0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
0db0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
0dc0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
0dd0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
0de0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
0df0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
0e00: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
0e10: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
0e20: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
0e30: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
0e40: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
0e50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
0e60: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
0e70: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
0e80: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
0e90: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
0ea0: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
0eb0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
0ec0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
0ed0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
0ee0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
0ef0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
0f00: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
0f10: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 69  e resolved..*/.i
0f20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
0f30: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
0f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
0f50: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
0f60: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
0f70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
0f80: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
0f90: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
0fa0: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
0fb0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
0fc0: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
0fd0: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 61  oc*2 + 10;.    a
0fe0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
0ff0: 6c 6f 63 28 20 70 2d 3e 61 4c 61 62 65 6c 2c 20  loc( p->aLabel, 
1000: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
1010: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1020: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
1030: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
1040: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61  qliteFree(p->aLa
1050: 62 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bel);.    }.    
1060: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 61 4e 65 77  p->aLabel = aNew
1070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
1080: 4c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Label==0 ){.    
1090: 70 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  p->nLabel = 0;. 
10a0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
10b0: 63 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  c = 0;.    retur
10c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c  n 0;.  }.  p->aL
10d0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
10e0: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
10f0: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1100: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1110: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1120: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1130: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
1140: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
1150: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
1160: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
1170: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
1180: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1190: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
11a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b  Vdbe *p, int x){
11d0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65  .  int j;.  asse
11e0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
11f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1200: 0a 20 20 69 66 28 20 78 3c 30 20 26 26 20 28 2d  .  if( x<0 && (-
1210: 78 29 3c 3d 70 2d 3e 6e 4c 61 62 65 6c 20 26 26  x)<=p->nLabel &&
1220: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 69   p->aOp ){.    i
1230: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d  f( p->aLabel[-1-
1240: 78 5d 3d 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74  x]==p->nOp ) ret
1250: 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  urn;.    assert(
1260: 20 70 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d   p->aLabel[-1-x]
1270: 3c 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4c 61  <0 );.    p->aLa
1280: 62 65 6c 5b 2d 31 2d 78 5d 20 3d 20 70 2d 3e 6e  bel[-1-x] = p->n
1290: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  Op;.    for(j=0;
12a0: 20 6a 3c 70 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b   j<p->nOp; j++){
12b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  .      if( p->aO
12c0: 70 5b 6a 5d 2e 70 32 3d 3d 78 20 29 20 70 2d 3e  p[j].p2==x ) p->
12d0: 61 4f 70 5b 6a 5d 2e 70 32 20 3d 20 70 2d 3e 6e  aOp[j].p2 = p->n
12e0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Op;.    }.  }.}.
12f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1300: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1310: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1320: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
1330: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1340: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1350: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
1360: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1370: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1380: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
13a0: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
13b0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
13c0: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
13d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
13e0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
13f0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
1400: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
1410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
1420: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
1430: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
1440: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
1450: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
1460: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1470: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1480: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
1490: 4f 70 20 3e 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  Op >= p->nOpAllo
14a0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  c ){.    int old
14b0: 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c  Size = p->nOpAll
14c0: 6f 63 3b 0a 20 20 20 20 4f 70 20 2a 61 4e 65 77  oc;.    Op *aNew
14d0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    p->nOpAllo
14e0: 63 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c = p->nOpAlloc*
14f0: 32 20 2b 20 6e 4f 70 20 2b 20 31 30 3b 0a 20 20  2 + nOp + 10;.  
1500: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
1510: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 70  ealloc(p->aOp, p
1520: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ->nOpAlloc*sizeo
1530: 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  f(Op));.    if( 
1540: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
1550: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f   p->nOpAlloc = o
1560: 6c 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 65  ldSize;.      re
1570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1580: 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4e 65 77 3b    p->aOp = aNew;
1590: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e  .    memset(&p->
15a0: 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c  aOp[oldSize], 0,
15b0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c   (p->nOpAlloc-ol
15c0: 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70  dSize)*sizeof(Op
15d0: 29 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  ));.  }.  addr =
15e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
15f0: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
1600: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
1610: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
1620: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
1630: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
1640: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
1650: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
1660: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
1670: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
1680: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
1690: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
16a0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
16b0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
16c0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
16d0: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
16e0: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
16f0: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
1700: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
1710: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
1720: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
1730: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
1740: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
1760: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
1770: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1780: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1790: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
17a0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
17b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
17c0: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
17d0: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
17e0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
17f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1800: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
1810: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1820: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1830: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1840: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1850: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1860: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1870: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1880: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1890: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
18a0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
18b0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
18c0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
18d0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
18e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
18f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1900: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1910: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1920: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1930: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
1940: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
1950: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
1960: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
1970: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
1980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
1990: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
19a0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
19b0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
19c0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
19d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
19e0: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
19f0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
1a00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1a10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
1a20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
1a30: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
1a40: 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b  ssert( val>=0 );
1a50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1a60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1a70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
1a80: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
1a90: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
1aa0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
1ab0: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
1ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1ad0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1ae0: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
1af0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
1b00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1b10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b20: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
1b30: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
1b40: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
1b50: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
1b60: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
1b70: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
1b80: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
1b90: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
1ba0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
1bb0: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
1bc0: 30 20 74 68 65 6e 20 74 68 65 20 50 33 20 6f 70  0 then the P3 op
1bd0: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
1be0: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
1bf0: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
1c00: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
1c10: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
1c20: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
1c30: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
1c40: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
1c50: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
1c60: 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP3 up to and in
1c70: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
1c80: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
1c90: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
1ca0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
1cb0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P3..**.** If n==
1cc0: 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65  P3_STATIC  it me
1cd0: 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73 20  ans that zP3 is 
1ce0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
1cf0: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
1d00: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
1d10: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
1d20: 65 20 70 6f 69 6e 74 65 72 2e 20 20 6e 3d 3d 50  e pointer.  n==P
1d30: 33 5f 50 4f 49 4e 54 45 52 20 6d 65 61 6e 73 20  3_POINTER means 
1d40: 7a 50 33 20 69 73 0a 2a 2a 20 61 20 70 6f 69 6e  zP3 is.** a poin
1d50: 74 65 72 20 74 6f 20 73 6f 6d 65 20 6f 62 6a 65  ter to some obje
1d60: 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ct other than a 
1d70: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  string..**.** If
1d80: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
1d90: 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f  nge P3 on the mo
1da0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
1db0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
1dc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dd0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
1de0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
1df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33   const char *zP3
1e00: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
1e10: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pOp;.  assert( p
1e20: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1e30: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1e40: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  ( p==0 || p->aOp
1e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1e60: 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64  if( addr<0 || ad
1e70: 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  dr>=p->nOp ){.  
1e80: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
1e90: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
1ea0: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
1eb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
1ec0: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 70  p[addr];.  if( p
1ed0: 4f 70 2d 3e 70 33 20 26 26 20 70 4f 70 2d 3e 70  Op->p3 && pOp->p
1ee0: 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49  3type==P3_DYNAMI
1ef0: 43 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  C ){.    sqliteF
1f00: 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  ree(pOp->p3);.  
1f10: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
1f20: 20 7d 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20   }.  if( zP3==0 
1f30: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  ){.    pOp->p3 =
1f40: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74   0;.    pOp->p3t
1f50: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
1f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
1f70: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  0 ){.    pOp->p3
1f80: 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20   = (char*)zP3;. 
1f90: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
1fa0: 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   n;.  }else{.   
1fb0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
1fc0: 6e 67 28 26 70 4f 70 2d 3e 70 33 2c 20 7a 50 33  ng(&pOp->p3, zP3
1fd0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 70 4f 70  , n, 0);.    pOp
1fe0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
1ff0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NAMIC;.  }.}../*
2000: 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 6f 70  .** If the P3 op
2010: 65 72 61 6e 64 20 74 6f 20 74 68 65 20 73 70 65  erand to the spe
2020: 63 69 66 69 65 64 20 69 6e 73 74 72 75 63 74 69  cified instructi
2030: 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 74 6f  on appears.** to
2040: 20 62 65 20 61 20 71 75 6f 74 65 64 20 73 74 72   be a quoted str
2050: 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 6e 20  ing token, then 
2060: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  this procedure r
2070: 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 20 71  emoves .** the q
2080: 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uotes..**.** The
2090: 20 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 74 6f   quoting operato
20a0: 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  r can be either 
20b0: 61 20 67 72 61 76 65 20 61 73 63 65 6e 74 20 28  a grave ascent (
20c0: 41 53 43 49 49 20 30 78 32 37 29 0a 2a 2a 20 6f  ASCII 0x27).** o
20d0: 72 20 61 20 64 6f 75 62 6c 65 20 71 75 6f 74 65  r a double quote
20e0: 20 63 68 61 72 61 63 74 65 72 20 28 41 53 43 49   character (ASCI
20f0: 49 20 30 78 32 32 29 2e 20 20 54 77 6f 20 71 75  I 0x22).  Two qu
2100: 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 0a 2a 2a  otes in a row.**
2110: 20 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 20 61   resolve to be a
2120: 20 73 69 6e 67 6c 65 20 61 63 74 75 61 6c 20 71   single actual q
2130: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77  uote character w
2140: 69 74 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67  ithin the string
2150: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2160: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 56  3VdbeDequoteP3(V
2170: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2180: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
2190: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
21a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
21b0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
21c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
21d0: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
21e0: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
21f0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
2200: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
2210: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
2220: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
2230: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20  Op[addr];.  if( 
2240: 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f  pOp->p3==0 || pO
2250: 70 2d 3e 70 33 5b 30 5d 3d 3d 30 20 29 20 72 65  p->p3[0]==0 ) re
2260: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 70 2d  turn;.  if( pOp-
2270: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
2280: 54 45 52 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  TER ) return;.  
2290: 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21  if( pOp->p3type!
22a0: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P3_DYNAMIC ){. 
22b0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c     pOp->p3 = sql
22c0: 69 74 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70  iteStrDup(pOp->p
22d0: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  3);.    pOp->p3t
22e0: 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43  ype = P3_DYNAMIC
22f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
2300: 65 71 75 6f 74 65 28 70 4f 70 2d 3e 70 33 29 3b  equote(pOp->p3);
2310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 74 68 65  .}../*.** On the
2320: 20 50 33 20 61 72 67 75 6d 65 6e 74 20 6f 66 20   P3 argument of 
2330: 74 68 65 20 67 69 76 65 6e 20 69 6e 73 74 72 75  the given instru
2340: 63 74 69 6f 6e 2c 20 63 68 61 6e 67 65 20 61 6c  ction, change al
2350: 6c 0a 2a 2a 20 73 74 72 69 6e 67 73 20 6f 66 20  l.** strings of 
2360: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
2370: 63 74 65 72 73 20 69 6e 74 6f 20 61 20 73 69 6e  cters into a sin
2380: 67 6c 65 20 73 70 61 63 65 20 61 6e 64 0a 2a 2a  gle space and.**
2390: 20 64 65 6c 65 74 65 20 6c 65 61 64 69 6e 67 20   delete leading 
23a0: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
23b0: 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 76 6f 69 64  tespace..*/.void
23c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
23d0: 72 65 73 73 53 70 61 63 65 28 56 64 62 65 20 2a  ressSpace(Vdbe *
23e0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2400: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
2410: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
2420: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2430: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2440: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
2450: 7c 7c 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64  || addr<0 || add
2460: 72 3e 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74 75  r>=p->nOp ) retu
2470: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
2480: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
2490: 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33   pOp->p3type==P3
24a0: 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
24b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
24c0: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 21 3d 50  ( pOp->p3type!=P
24d0: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
24e0: 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74   pOp->p3 = sqlit
24f0: 65 53 74 72 44 75 70 28 70 4f 70 2d 3e 70 33 29  eStrDup(pOp->p3)
2500: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
2510: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
2520: 20 20 7d 0a 20 20 7a 20 3d 20 28 75 6e 73 69 67    }.  z = (unsig
2530: 6e 65 64 20 63 68 61 72 2a 29 70 4f 70 2d 3e 70  ned char*)pOp->p
2540: 33 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  3;.  if( z==0 ) 
2550: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 6a 20  return;.  i = j 
2560: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  = 0;.  while( is
2570: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
2580: 2b 2b 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a  ++; }.  while( z
2590: 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 69  [i] ){.    if( i
25a0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
25b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
25c0: 20 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ';.      while(
25d0: 20 69 73 73 70 61 63 65 28 7a 5b 2b 2b 69 5d 29   isspace(z[++i])
25e0: 20 29 7b 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ){}.    }else{.
25f0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
2600: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2610: 0a 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26  .  while( j>0 &&
2620: 20 69 73 73 70 61 63 65 28 7a 5b 6a 2d 31 5d 29   isspace(z[j-1])
2630: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 7a 5b 6a   ){ j--; }.  z[j
2640: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
2650: 53 65 61 72 63 68 20 74 68 65 20 63 75 72 72 65  Search the curre
2660: 6e 74 20 70 72 6f 67 72 61 6d 20 73 74 61 72 74  nt program start
2670: 69 6e 67 20 61 74 20 69 6e 73 74 72 75 63 74 69  ing at instructi
2680: 6f 6e 20 61 64 64 72 20 66 6f 72 20 74 68 65 20  on addr for the 
2690: 67 69 76 65 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  given.** opcode 
26a0: 61 6e 64 20 50 32 20 76 61 6c 75 65 2e 20 20 52  and P2 value.  R
26b0: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
26c0: 73 20 70 6c 75 73 20 31 20 69 66 20 66 6f 75 6e  s plus 1 if foun
26d0: 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 0a 2a  d and 0 if not.*
26e0: 2a 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  * found..*/.int 
26f0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 4f  sqlite3VdbeFindO
2700: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
2710: 64 64 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  ddr, int op, int
2720: 20 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   p2){.  int i;. 
2730: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
2740: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2750: 49 54 20 29 3b 0a 20 20 66 6f 72 28 69 3d 61 64  IT );.  for(i=ad
2760: 64 72 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  dr; i<p->nOp; i+
2770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  +){.    if( p->a
2780: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op[i].opcode==op
2790: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32   && p->aOp[i].p2
27a0: 3d 3d 70 32 20 29 20 72 65 74 75 72 6e 20 69 2b  ==p2 ) return i+
27b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
27c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
27d0: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
27e0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
27f0: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
2800: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
2810: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2820: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
2830: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2840: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
2850: 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61  rt( addr>=0 && a
2860: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
2870: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
2880: 64 64 72 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ddr];.}../*.** T
2890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
28a0: 75 70 20 6f 72 20 72 6f 75 74 69 6e 65 73 20 61  up or routines a
28b0: 72 65 20 65 6d 70 6c 6f 79 65 64 20 62 79 20 69  re employed by i
28c0: 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75 6e 63 74  nstallable funct
28d0: 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 75 72  ions.** to retur
28e0: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 73 2e  n their results.
28f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
2900: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74  e3_set_result_st
2910: 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 20 63  ring() routine c
2920: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  an be used to re
2930: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 0a 2a 2a  turn a string.**
2940: 20 76 61 6c 75 65 20 6f 72 20 74 6f 20 72 65 74   value or to ret
2950: 75 72 6e 20 61 20 4e 55 4c 4c 2e 20 20 54 6f 20  urn a NULL.  To 
2960: 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 2c 20 70  return a NULL, p
2970: 61 73 73 20 69 6e 20 4e 55 4c 4c 20 66 6f 72 20  ass in NULL for 
2980: 7a 52 65 73 75 6c 74 2e 0a 2a 2a 20 41 20 63 6f  zResult..** A co
2990: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
29a0: 65 20 73 74 72 69 6e 67 20 62 65 66 6f 72 65 20  e string before 
29b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
29c0: 75 72 6e 73 20 73 6f 20 69 74 20 69 73 20 73 61  urns so it is sa
29d0: 66 65 0a 2a 2a 20 74 6f 20 70 61 73 73 20 69 6e  fe.** to pass in
29e0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74   an ephemeral st
29f0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ring..**.** sqli
2a00: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65  te3_set_result_e
2a10: 72 72 6f 72 28 29 20 77 6f 72 6b 73 20 6c 69 6b  rror() works lik
2a20: 65 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65  e sqlite3_set_re
2a30: 73 75 6c 74 5f 73 74 72 69 6e 67 28 29 20 65 78  sult_string() ex
2a40: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
2a50: 73 69 67 6e 61 6c 73 20 61 20 66 61 74 61 6c 20  signals a fatal 
2a60: 65 72 72 6f 72 2e 20 20 54 68 65 20 73 74 72 69  error.  The stri
2a70: 6e 67 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  ng argument, if 
2a80: 61 6e 79 2c 20 69 73 20 74 68 65 0a 2a 2a 20 65  any, is the.** e
2a90: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 49  rror message.  I
2aa0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
2ab0: 73 20 4e 55 4c 4c 20 61 20 67 65 6e 65 72 69 63  s NULL a generic
2ac0: 20 73 75 62 73 74 69 74 75 74 65 20 65 72 72 6f   substitute erro
2ad0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
2ae0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
2af0: 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73 75  sqlite3_set_resu
2b00: 6c 74 5f 69 6e 74 28 29 20 61 6e 64 20 73 71 6c  lt_int() and sql
2b10: 69 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f  ite3_set_result_
2b20: 64 6f 75 62 6c 65 28 29 20 73 65 74 20 74 68 65  double() set the
2b30: 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
2b40: 20 6f 66 20 74 68 65 20 75 73 65 72 20 66 75 6e   of the user fun
2b50: 63 74 69 6f 6e 20 74 6f 20 61 6e 20 69 6e 74 65  ction to an inte
2b60: 67 65 72 20 6f 72 20 61 20 64 6f 75 62 6c 65 2e  ger or a double.
2b70: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
2b80: 74 69 6e 65 73 20 61 72 65 20 64 65 66 69 6e 65  tines are define
2b90: 64 20 68 65 72 65 20 69 6e 20 76 64 62 65 2e 63  d here in vdbe.c
2ba0: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 64 65   because they de
2bb0: 70 65 6e 64 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a  pend on knowing.
2bc0: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 73  ** the internals
2bd0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 66   of the sqlite_f
2be0: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 68  unc structure wh
2bf0: 69 63 68 20 69 73 20 6f 6e 6c 79 20 64 65 66 69  ich is only defi
2c00: 6e 65 64 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20  ned in .** this 
2c10: 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 2a 2f 0a  source file..*/.
2c20: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 65  char *sqlite3_se
2c30: 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28  t_result_string(
2c40: 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 70 2c 20  sqlite_func *p, 
2c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 73  const char *zRes
2c60: 75 6c 74 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61  ult, int n){.  a
2c70: 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53 74 65  ssert( !p->isSte
2c80: 70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 2e  p );.  if( p->s.
2c90: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2ca0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2cb0: 65 28 70 2d 3e 73 2e 7a 29 3b 0a 20 20 7d 0a 20  e(p->s.z);.  }. 
2cc0: 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20   if( zResult==0 
2cd0: 29 7b 0a 20 20 20 20 70 2d 3e 73 2e 66 6c 61 67  ){.    p->s.flag
2ce0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
2cf0: 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e    n = 0;.    p->
2d00: 73 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  s.z = 0;.    p->
2d10: 73 2e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  s.n = 0;.  }else
2d20: 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20  {.    if( n<0 ) 
2d30: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75  n = strlen(zResu
2d40: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 4e  lt);.    if( n<N
2d50: 42 46 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  BFS-1 ){.      m
2d60: 65 6d 63 70 79 28 70 2d 3e 73 2e 7a 53 68 6f 72  emcpy(p->s.zShor
2d70: 74 2c 20 7a 52 65 73 75 6c 74 2c 20 6e 29 3b 0a  t, zResult, n);.
2d80: 20 20 20 20 20 20 70 2d 3e 73 2e 7a 53 68 6f 72        p->s.zShor
2d90: 74 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[n] = 0;.      
2da0: 70 2d 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  p->s.flags = MEM
2db0: 5f 53 74 72 20 7c 20 4d 45 4d 5f 53 68 6f 72 74  _Str | MEM_Short
2dc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 2e 7a 20 3d  ;.      p->s.z =
2dd0: 20 70 2d 3e 73 2e 7a 53 68 6f 72 74 3b 0a 20 20   p->s.zShort;.  
2de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2df0: 2d 3e 73 2e 7a 20 3d 20 73 71 6c 69 74 65 4d 61  ->s.z = sqliteMa
2e00: 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a  llocRaw( n+1 );.
2e10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 2e 7a        if( p->s.z
2e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2e30: 70 79 28 70 2d 3e 73 2e 7a 2c 20 7a 52 65 73 75  py(p->s.z, zResu
2e40: 6c 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  lt, n);.        
2e50: 70 2d 3e 73 2e 7a 5b 6e 5d 20 3d 20 30 3b 0a 20  p->s.z[n] = 0;. 
2e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
2e70: 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  s.flags = MEM_St
2e80: 72 20 7c 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  r | MEM_Dyn;.   
2e90: 20 7d 0a 20 20 20 20 70 2d 3e 73 2e 6e 20 3d 20   }.    p->s.n = 
2ea0: 6e 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n+1;.  }.  retur
2eb0: 6e 20 70 2d 3e 73 2e 7a 3b 0a 7d 0a 76 6f 69 64  n p->s.z;.}.void
2ec0: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72 65 73   sqlite3_set_res
2ed0: 75 6c 74 5f 69 6e 74 28 73 71 6c 69 74 65 5f 66  ult_int(sqlite_f
2ee0: 75 6e 63 20 2a 70 2c 20 69 6e 74 20 69 52 65 73  unc *p, int iRes
2ef0: 75 6c 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ult){.  assert( 
2f00: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
2f10: 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26  if( p->s.flags &
2f20: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
2f30: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e  sqliteFree(p->s.
2f40: 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 2e 69  z);.  }.  p->s.i
2f50: 20 3d 20 69 52 65 73 75 6c 74 3b 0a 20 20 70 2d   = iResult;.  p-
2f60: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  >s.flags = MEM_I
2f70: 6e 74 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  nt;.}.void sqlit
2f80: 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 64 6f  e3_set_result_do
2f90: 75 62 6c 65 28 73 71 6c 69 74 65 5f 66 75 6e 63  uble(sqlite_func
2fa0: 20 2a 70 2c 20 64 6f 75 62 6c 65 20 72 52 65 73   *p, double rRes
2fb0: 75 6c 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ult){.  assert( 
2fc0: 21 70 2d 3e 69 73 53 74 65 70 20 29 3b 0a 20 20  !p->isStep );.  
2fd0: 69 66 28 20 70 2d 3e 73 2e 66 6c 61 67 73 20 26  if( p->s.flags &
2fe0: 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20   MEM_Dyn ){.    
2ff0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 73 2e  sqliteFree(p->s.
3000: 7a 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 2e 72  z);.  }.  p->s.r
3010: 20 3d 20 72 52 65 73 75 6c 74 3b 0a 20 20 70 2d   = rResult;.  p-
3020: 3e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52  >s.flags = MEM_R
3030: 65 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  eal;.}.void sqli
3040: 74 65 33 5f 73 65 74 5f 72 65 73 75 6c 74 5f 65  te3_set_result_e
3050: 72 72 6f 72 28 73 71 6c 69 74 65 5f 66 75 6e 63  rror(sqlite_func
3060: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3070: 2a 7a 4d 73 67 2c 20 69 6e 74 20 6e 29 7b 0a 20  *zMsg, int n){. 
3080: 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 53   assert( !p->isS
3090: 74 65 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  tep );.  sqlite3
30a0: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
30b0: 6e 67 28 70 2c 20 7a 4d 73 67 2c 20 6e 29 3b 0a  ng(p, zMsg, n);.
30c0: 20 20 70 2d 3e 69 73 45 72 72 6f 72 20 3d 20 31    p->isError = 1
30d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61  ;.}../*.** Extra
30e0: 63 74 20 74 68 65 20 75 73 65 72 20 64 61 74 61  ct the user data
30f0: 20 66 72 6f 6d 20 61 20 73 71 6c 69 74 65 5f 66   from a sqlite_f
3100: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 61 6e  unc structure an
3110: 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
3120: 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 2a 2f 0a  inter to it..*/.
3130: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 73  void *sqlite3_us
3140: 65 72 5f 64 61 74 61 28 73 71 6c 69 74 65 5f 66  er_data(sqlite_f
3150: 75 6e 63 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  unc *p){.  asser
3160: 74 28 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63  t( p && p->pFunc
3170: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
3180: 70 46 75 6e 63 2d 3e 70 55 73 65 72 44 61 74 61  pFunc->pUserData
3190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
31a0: 61 74 65 20 6f 72 20 72 65 74 75 72 6e 20 74 68  ate or return th
31b0: 65 20 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74  e aggregate cont
31c0: 65 78 74 20 66 6f 72 20 61 20 75 73 65 72 20 66  ext for a user f
31d0: 75 6e 63 74 69 6f 6e 2e 20 20 41 20 6e 65 77 0a  unction.  A new.
31e0: 2a 2a 20 63 6f 6e 74 65 78 74 20 69 73 20 61 6c  ** context is al
31f0: 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 66  located on the f
3200: 69 72 73 74 20 63 61 6c 6c 2e 20 20 53 75 62 73  irst call.  Subs
3210: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 72 65 74  equent calls ret
3220: 75 72 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  urn the.** same 
3230: 63 6f 6e 74 65 78 74 20 74 68 61 74 20 77 61 73  context that was
3240: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 70 72 69   returned on pri
3250: 6f 72 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  or calls..**.** 
3260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3270: 64 65 66 69 6e 65 64 20 68 65 72 65 20 69 6e 20  defined here in 
3280: 76 64 62 65 2e 63 20 62 65 63 61 75 73 65 20 69  vdbe.c because i
3290: 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 6b 6e 6f  t depends on kno
32a0: 77 69 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 74 65  wing.** the inte
32b0: 72 6e 61 6c 73 20 6f 66 20 74 68 65 20 73 71 6c  rnals of the sql
32c0: 69 74 65 5f 66 75 6e 63 20 73 74 72 75 63 74 75  ite_func structu
32d0: 72 65 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  re which is only
32e0: 20 64 65 66 69 6e 65 64 20 69 6e 0a 2a 2a 20 74   defined in.** t
32f0: 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c 65 2e  his source file.
3300: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
3310: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3320: 65 78 74 28 73 71 6c 69 74 65 5f 66 75 6e 63 20  ext(sqlite_func 
3330: 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  *p, int nByte){.
3340: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
3350: 2d 3e 70 46 75 6e 63 20 26 26 20 70 2d 3e 70 46  ->pFunc && p->pF
3360: 75 6e 63 2d 3e 78 53 74 65 70 20 29 3b 0a 20 20  unc->xStep );.  
3370: 69 66 28 20 70 2d 3e 70 41 67 67 3d 3d 30 20 29  if( p->pAgg==0 )
3380: 7b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  {.    if( nByte<
3390: 3d 4e 42 46 53 20 29 7b 0a 20 20 20 20 20 20 70  =NBFS ){.      p
33a0: 2d 3e 70 41 67 67 20 3d 20 28 76 6f 69 64 2a 29  ->pAgg = (void*)
33b0: 70 2d 3e 73 2e 7a 3b 0a 20 20 20 20 20 20 6d 65  p->s.z;.      me
33c0: 6d 73 65 74 28 70 2d 3e 70 41 67 67 2c 20 30 2c  mset(p->pAgg, 0,
33d0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 65 6c   nByte);.    }el
33e0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 70 41 67  se{.      p->pAg
33f0: 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
3400: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 7d  ( nByte );.    }
3410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
3420: 3e 70 41 67 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pAgg;.}../*.** 
3430: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3440: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 65 20 53  r of times the S
3450: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  tep function of 
3460: 61 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  a aggregate has 
3470: 62 65 65 6e 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e  been .** called.
3480: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3490: 69 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20 68  ine is defined h
34a0: 65 72 65 20 69 6e 20 76 64 62 65 2e 63 20 62 65  ere in vdbe.c be
34b0: 63 61 75 73 65 20 69 74 20 64 65 70 65 6e 64 73  cause it depends
34c0: 20 6f 6e 20 6b 6e 6f 77 69 6e 67 0a 2a 2a 20 74   on knowing.** t
34d0: 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66 20  he internals of 
34e0: 74 68 65 20 73 71 6c 69 74 65 5f 66 75 6e 63 20  the sqlite_func 
34f0: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
3500: 69 73 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20  is only defined 
3510: 69 6e 0a 2a 2a 20 74 68 69 73 20 73 6f 75 72 63  in.** this sourc
3520: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e file..*/.int s
3530: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3540: 5f 63 6f 75 6e 74 28 73 71 6c 69 74 65 5f 66 75  _count(sqlite_fu
3550: 6e 63 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  nc *p){.  assert
3560: 28 20 70 20 26 26 20 70 2d 3e 70 46 75 6e 63 20  ( p && p->pFunc 
3570: 26 26 20 70 2d 3e 70 46 75 6e 63 2d 3e 78 53 74  && p->pFunc->xSt
3580: 65 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ep );.  return p
3590: 2d 3e 63 6e 74 3b 0a 7d 0a 0a 23 69 66 20 21 64  ->cnt;.}..#if !d
35a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
35b0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
35c0: 52 4f 46 49 4c 45 29 0a 2f 2a 0a 2a 2a 20 50 72  ROFILE)./*.** Pr
35d0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
35e0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
35f0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
3600: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
3610: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3620: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
3630: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
3640: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
3650: 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP3;.  char zPtr
3660: 5b 34 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  [40];.  if( pOp-
3670: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 50 4f 49 4e  >p3type==P3_POIN
3680: 54 45 52 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  TER ){.    sprin
3690: 74 66 28 7a 50 74 72 2c 20 22 70 74 72 28 25 23  tf(zPtr, "ptr(%#
36a0: 78 29 22 2c 20 28 69 6e 74 29 70 4f 70 2d 3e 70  x)", (int)pOp->p
36b0: 33 29 3b 0a 20 20 20 20 7a 50 33 20 3d 20 7a 50  3);.    zP3 = zP
36c0: 74 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  tr;.  }else{.   
36d0: 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   zP3 = pOp->p3;.
36e0: 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d    }.  if( pOut==
36f0: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
3700: 74 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  t;.  fprintf(pOu
3710: 74 2c 22 25 34 64 20 25 2d 31 32 73 20 25 34 64  t,"%4d %-12s %4d
3720: 20 25 34 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %4d %s\n",.    
3730: 20 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63    pc, sqlite3Opc
3740: 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70  odeNames[pOp->op
3750: 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20  code], pOp->p1, 
3760: 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 20 3f 20 7a  pOp->p2, zP3 ? z
3770: 50 33 20 3a 20 22 22 29 3b 0a 20 20 66 66 6c 75  P3 : "");.  fflu
3780: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
3790: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  if../*.** Give a
37a0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
37b0: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
37c0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
37d0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
37e0: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
37f0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
3800: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
3810: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
3820: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
3830: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
3840: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
3850: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
3860: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
3870: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
3880: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f  nt "EXPLAIN"..*/
3890: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
38a0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
38d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  .){.  sqlite *db
38e0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
38f0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
3900: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
3910: 63 20 63 68 61 72 20 2a 61 7a 43 6f 6c 75 6d 6e  c char *azColumn
3920: 4e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Names[] = {.    
3930: 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
3940: 22 2c 20 22 70 31 22 2c 20 20 22 70 32 22 2c 20  ", "p1",  "p2", 
3950: 20 22 70 33 22 2c 20 0a 20 20 20 20 20 22 69 6e   "p3", .     "in
3960: 74 22 2c 20 20 22 74 65 78 74 22 2c 20 20 20 22  t",  "text",   "
3970: 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 74 65  int", "int", "te
3980: 78 74 22 2c 0a 20 20 20 20 20 30 0a 20 20 7d 3b  xt",.     0.  };
3990: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
39a0: 6f 70 53 74 61 63 6b 3d 3d 30 20 29 3b 0a 20 20  opStack==0 );.  
39b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
39c0: 69 6e 20 29 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c  in );.  p->azCol
39d0: 4e 61 6d 65 20 3d 20 61 7a 43 6f 6c 75 6d 6e 4e  Name = azColumnN
39e0: 61 6d 65 73 3b 0a 20 20 70 2d 3e 61 7a 52 65 73  ames;.  p->azRes
39f0: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 7a 41 72 67  Column = p->zArg
3a00: 76 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  v;.  for(i=0; i<
3a10: 35 3b 20 69 2b 2b 29 20 70 2d 3e 7a 41 72 67 76  5; i++) p->zArgv
3a20: 5b 69 5d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b  [i] = p->aStack[
3a30: 69 5d 2e 7a 53 68 6f 72 74 3b 0a 20 20 69 20 3d  i].zShort;.  i =
3a40: 20 70 2d 3e 70 63 3b 0a 20 20 69 66 28 20 69 3e   p->pc;.  if( i>
3a50: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
3a60: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
3a70: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
3a80: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
3a90: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
3aa0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
3ab0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
3ac0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3ad0: 65 72 72 75 70 74 3b 0a 20 20 20 20 69 66 28 20  errupt;.    if( 
3ae0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
3af0: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a  E_MAGIC_BUSY ){.
3b00: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
3b10: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20  LITE_MISUSE;.   
3b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
3b30: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
3b40: 45 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ERRUPT;.    }.  
3b50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3b60: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
3b70: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
3b80: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
3b90: 72 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d 3e 72  rror_string(p->r
3ba0: 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
3bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69   }else{.    spri
3bc0: 6e 74 66 28 70 2d 3e 7a 41 72 67 76 5b 30 5d 2c  ntf(p->zArgv[0],
3bd0: 22 25 64 22 2c 69 29 3b 0a 20 20 20 20 73 70 72  "%d",i);.    spr
3be0: 69 6e 74 66 28 70 2d 3e 7a 41 72 67 76 5b 32 5d  intf(p->zArgv[2]
3bf0: 2c 22 25 64 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  ,"%d", p->aOp[i]
3c00: 2e 70 31 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  .p1);.    sprint
3c10: 66 28 70 2d 3e 7a 41 72 67 76 5b 33 5d 2c 22 25  f(p->zArgv[3],"%
3c20: 64 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32  d", p->aOp[i].p2
3c30: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f  );.    if( p->aO
3c40: 70 5b 69 5d 2e 70 33 74 79 70 65 3d 3d 50 33 5f  p[i].p3type==P3_
3c50: 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
3c60: 20 73 70 72 69 6e 74 66 28 70 2d 3e 61 53 74 61   sprintf(p->aSta
3c70: 63 6b 5b 34 5d 2e 7a 53 68 6f 72 74 2c 20 22 70  ck[4].zShort, "p
3c80: 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29 70  tr(%#x)", (int)p
3c90: 2d 3e 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20  ->aOp[i].p3);.  
3ca0: 20 20 20 20 70 2d 3e 7a 41 72 67 76 5b 34 5d 20      p->zArgv[4] 
3cb0: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 2e 7a  = p->aStack[4].z
3cc0: 53 68 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  Short;.    }else
3cd0: 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 41 72 67 76  {.      p->zArgv
3ce0: 5b 34 5d 20 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e  [4] = p->aOp[i].
3cf0: 70 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  p3;.    }.    p-
3d00: 3e 7a 41 72 67 76 5b 31 5d 20 3d 20 73 71 6c 69  >zArgv[1] = sqli
3d10: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
3d20: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 5d  ->aOp[i].opcode]
3d30: 3b 0a 20 20 20 20 70 2d 3e 70 63 20 3d 20 69 2b  ;.    p->pc = i+
3d40: 31 3b 0a 20 20 20 20 70 2d 3e 61 7a 52 65 73 43  1;.    p->azResC
3d50: 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 7a 41 72 67 76  olumn = p->zArgv
3d60: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ;.    p->nResCol
3d70: 75 6d 6e 20 3d 20 35 3b 0a 20 20 20 20 70 2d 3e  umn = 5;.    p->
3d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3d90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3da0: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
3db0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
3dc0: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
3dd0: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
3de0: 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e  cution.  This in
3df0: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
3e00: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
3e10: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
3e20: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
3e30: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
3e40: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
3e50: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
3e60: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
3e70: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
3e80: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
3e90: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
3ea0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2f 0a 76 6f  eExec().  .*/.vo
3eb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
3ec0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
3ed0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
3ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3ef0: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
3f00: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
3f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3f20: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
3f30: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
3f40: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ent */.  int isE
3f50: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
3f60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f70: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
3f80: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
3f90: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
3fa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
3fb0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3fc0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3fd0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
3fe0: 2a 20 41 64 64 20 61 20 48 41 4c 54 20 69 6e 73  * Add a HALT ins
3ff0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
4000: 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65 20  very end of the 
4010: 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
4020: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 7c 7c  if( p->nOp==0 ||
4030: 20 28 70 2d 3e 61 4f 70 20 26 26 20 70 2d 3e 61   (p->aOp && p->a
4040: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63  Op[p->nOp-1].opc
4050: 6f 64 65 21 3d 4f 50 5f 48 61 6c 74 29 20 29 7b  ode!=OP_Halt) ){
4060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4070: 41 64 64 4f 70 28 70 2c 20 4f 50 5f 48 61 6c 74  AddOp(p, OP_Halt
4080: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
4090: 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f  /* No instructio
40a0: 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f  n ever pushes mo
40b0: 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65  re than a single
40c0: 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68   element onto th
40d0: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41  e.  ** stack.  A
40e0: 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76  nd the stack nev
40f0: 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63  er grows on succ
4100: 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e  essive execution
4110: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61  s of the.  ** sa
4120: 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65  me loop.  So the
4130: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
4140: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73   instructions is
4150: 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a   an upper bound.
4160: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69    ** on the maxi
4170: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20  mum stack depth 
4180: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
4190: 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61   ** Allocation a
41a0: 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61  ll the stack spa
41b0: 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20  ce we will ever 
41c0: 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  need..  */.  if(
41d0: 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b   p->aStack==0 ){
41e0: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e  .    p->nVar = n
41f0: 56 61 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Var;.    assert(
4200: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20   nVar>=0 );.    
4210: 6e 20 3d 20 69 73 45 78 70 6c 61 69 6e 20 3f 20  n = isExplain ? 
4220: 31 30 20 3a 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  10 : p->nOp;.   
4230: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
4240: 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  iteMalloc(.     
4250: 20 6e 2a 28 73 69 7a 65 6f 66 28 70 2d 3e 61 53   n*(sizeof(p->aS
4260: 74 61 63 6b 5b 30 5d 29 20 2b 20 32 2a 73 69 7a  tack[0]) + 2*siz
4270: 65 6f 66 28 63 68 61 72 2a 29 29 20 20 20 20 20  eof(char*))     
4280: 2f 2a 20 61 53 74 61 63 6b 20 61 6e 64 20 7a 41  /* aStack and zA
4290: 72 67 76 20 2a 2f 0a 20 20 20 20 20 20 2b 20 70  rgv */.      + p
42a0: 2d 3e 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  ->nVar*sizeof(Me
42b0: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
42d0: 70 56 61 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  pVar */.    );. 
42e0: 20 20 20 70 2d 3e 7a 41 72 67 76 20 3d 20 28 63     p->zArgv = (c
42f0: 68 61 72 2a 2a 29 26 70 2d 3e 61 53 74 61 63 6b  har**)&p->aStack
4300: 5b 6e 5d 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  [n];.    p->azCo
4310: 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 2a 29  lName = (char**)
4320: 26 70 2d 3e 7a 41 72 67 76 5b 6e 5d 3b 0a 20 20  &p->zArgv[n];.  
4330: 20 20 70 2d 3e 61 70 56 61 72 20 3d 20 28 4d 65    p->apVar = (Me
4340: 6d 20 2a 29 26 70 2d 3e 61 7a 43 6f 6c 4e 61 6d  m *)&p->azColNam
4350: 65 5b 6e 5d 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  e[n];.    for(n=
4360: 30 3b 20 6e 3c 70 2d 3e 6e 56 61 72 3b 20 6e 2b  0; n<p->nVar; n+
4370: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 70 56  +){.      p->apV
4380: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
4390: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  M_Null;.    }.  
43a0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  }..  sqlite3Hash
43b0: 49 6e 69 74 28 26 70 2d 3e 61 67 67 2e 68 61 73  Init(&p->agg.has
43c0: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  h, SQLITE_HASH_B
43d0: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 70 2d 3e  INARY, 0);.  p->
43e0: 61 67 67 2e 70 53 65 61 72 63 68 20 3d 20 30 3b  agg.pSearch = 0;
43f0: 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44  .#ifdef MEMORY_D
4400: 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74  EBUG.  if( sqlit
4410: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22  e3OsFileExists("
4420: 76 64 62 65 5f 74 72 61 63 65 22 29 20 29 7b 0a  vdbe_trace") ){.
4430: 20 20 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 73      p->trace = s
4440: 74 64 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tdout;.  }.#endi
4450: 66 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70  f.  p->pTos = &p
4460: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20  ->aStack[-1];.  
4470: 70 2d 3e 70 63 20 3d 20 30 3b 0a 20 20 70 2d 3e  p->pc = 0;.  p->
4480: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4490: 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d    p->uniqueCnt =
44a0: 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44   0;.  p->returnD
44b0: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  epth = 0;.  p->e
44c0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
44d0: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 75 6e 64 6f  Abort;.  p->undo
44e0: 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20 3d 20 30  TransOnError = 0
44f0: 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20  ;.  p->popStack 
4500: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
4510: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
4520: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
4530: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 23 69  BE_MAGIC_RUN;.#i
4540: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4550: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
4560: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4570: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
4580: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
4590: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
45a0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
45b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
45c0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  dif.}.../*.** Re
45d0: 6d 6f 76 65 20 61 6e 79 20 65 6c 65 6d 65 6e 74  move any element
45e0: 73 20 74 68 61 74 20 72 65 6d 61 69 6e 20 6f 6e  s that remain on
45f0: 20 74 68 65 20 73 6f 72 74 65 72 20 66 6f 72 20   the sorter for 
4600: 74 68 65 20 56 44 42 45 20 67 69 76 65 6e 2e 0a  the VDBE given..
4610: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4620: 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28 56  dbeSorterReset(V
4630: 64 62 65 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  dbe *p){.  while
4640: 28 20 70 2d 3e 70 53 6f 72 74 20 29 7b 0a 20 20  ( p->pSort ){.  
4650: 20 20 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65    Sorter *pSorte
4660: 72 20 3d 20 70 2d 3e 70 53 6f 72 74 3b 0a 20 20  r = p->pSort;.  
4670: 20 20 70 2d 3e 70 53 6f 72 74 20 3d 20 70 53 6f    p->pSort = pSo
4680: 72 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  rter->pNext;.   
4690: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72   sqliteFree(pSor
46a0: 74 65 72 2d 3e 7a 4b 65 79 29 3b 0a 20 20 20 20  ter->zKey);.    
46b0: 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74  sqliteFree(pSort
46c0: 65 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  er->pData);.    
46d0: 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72 74  sqliteFree(pSort
46e0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
46f0: 2a 20 52 65 73 65 74 20 61 6e 20 41 67 67 20 73  * Reset an Agg s
4700: 74 72 75 63 74 75 72 65 2e 20 20 44 65 6c 65 74  tructure.  Delet
4710: 65 20 61 6c 6c 20 69 74 73 20 63 6f 6e 74 65 6e  e all its conten
4720: 74 73 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  ts. .**.** For i
4730: 6e 73 74 61 6c 6c 61 62 6c 65 20 61 67 67 72 65  nstallable aggre
4740: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  gate functions, 
4750: 69 66 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  if the step func
4760: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  tion has been.**
4770: 20 63 61 6c 6c 65 64 2c 20 6d 61 6b 65 20 73 75   called, make su
4780: 72 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72  re the finalizer
4790: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
47a0: 73 6f 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20  so been called. 
47b0: 20 54 68 65 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   The.** finalize
47c0: 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  r might need to 
47d0: 66 72 65 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  free memory that
47e0: 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61   was allocated a
47f0: 73 20 70 61 72 74 20 6f 66 20 69 74 73 0a 2a 2a  s part of its.**
4800: 20 70 72 69 76 61 74 65 20 63 6f 6e 74 65 78 74   private context
4810: 2e 20 20 49 66 20 74 68 65 20 66 69 6e 61 6c 69  .  If the finali
4820: 7a 65 72 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  zer has not been
4830: 20 63 61 6c 6c 65 64 20 79 65 74 2c 20 63 61 6c   called yet, cal
4840: 6c 20 69 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a 2f 0a  l it.** now..*/.
4850: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4860: 41 67 67 52 65 73 65 74 28 41 67 67 20 2a 70 41  AggReset(Agg *pA
4870: 67 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gg){.  int i;.  
4880: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 66  HashElem *p;.  f
4890: 6f 72 28 70 20 3d 20 73 71 6c 69 74 65 48 61 73  or(p = sqliteHas
48a0: 68 46 69 72 73 74 28 26 70 41 67 67 2d 3e 68 61  hFirst(&pAgg->ha
48b0: 73 68 29 3b 20 70 3b 20 70 20 3d 20 73 71 6c 69  sh); p; p = sqli
48c0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
48d0: 20 20 20 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c      AggElem *pEl
48e0: 65 6d 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  em = sqliteHashD
48f0: 61 74 61 28 70 29 3b 0a 20 20 20 20 61 73 73 65  ata(p);.    asse
4900: 72 74 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63  rt( pAgg->apFunc
4910: 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
4920: 3d 30 3b 20 69 3c 70 41 67 67 2d 3e 6e 4d 65 6d  =0; i<pAgg->nMem
4930: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65  ; i++){.      Me
4940: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 45 6c 65 6d  m *pMem = &pElem
4950: 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20  ->aMem[i];.     
4960: 20 69 66 28 20 70 41 67 67 2d 3e 61 70 46 75 6e   if( pAgg->apFun
4970: 63 5b 69 5d 20 26 26 20 28 70 4d 65 6d 2d 3e 66  c[i] && (pMem->f
4980: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 43 74  lags & MEM_AggCt
4990: 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  x)!=0 ){.       
49a0: 20 73 71 6c 69 74 65 5f 66 75 6e 63 20 63 74 78   sqlite_func ctx
49b0: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 70 46  ;.        ctx.pF
49c0: 75 6e 63 20 3d 20 70 41 67 67 2d 3e 61 70 46 75  unc = pAgg->apFu
49d0: 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 63  nc[i];.        c
49e0: 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  tx.s.flags = MEM
49f0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63  _Null;.        c
4a00: 74 78 2e 70 41 67 67 20 3d 20 70 4d 65 6d 2d 3e  tx.pAgg = pMem->
4a10: 7a 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2e 63  z;.        ctx.c
4a20: 6e 74 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20  nt = pMem->i;.  
4a30: 20 20 20 20 20 20 63 74 78 2e 69 73 53 74 65 70        ctx.isStep
4a40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 74   = 0;.        ct
4a50: 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20  x.isError = 0;. 
4a60: 20 20 20 20 20 20 20 28 2a 70 41 67 67 2d 3e 61         (*pAgg->a
4a70: 70 46 75 6e 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c  pFunc[i]->xFinal
4a80: 69 7a 65 29 28 26 63 74 78 29 3b 0a 20 20 20 20  ize)(&ctx);.    
4a90: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 21      if( pMem->z!
4aa0: 3d 30 20 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70  =0 && pMem->z!=p
4ab0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 20 29 7b 0a 20  Mem->zShort ){. 
4ac0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
4ad0: 72 65 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  ree(pMem->z);.  
4ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4af0: 69 66 28 20 63 74 78 2e 73 2e 66 6c 61 67 73 20  if( ctx.s.flags 
4b00: 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  & MEM_Dyn ){.   
4b10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
4b20: 65 28 63 74 78 2e 73 2e 7a 29 3b 0a 20 20 20 20  e(ctx.s.z);.    
4b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
4b40: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
4b50: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20  s & MEM_Dyn ){. 
4b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
4b70: 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  e(pMem->z);.    
4b80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4b90: 6c 69 74 65 46 72 65 65 28 70 45 6c 65 6d 29 3b  liteFree(pElem);
4ba0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
4bb0: 73 68 43 6c 65 61 72 28 26 70 41 67 67 2d 3e 68  shClear(&pAgg->h
4bc0: 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ash);.  sqliteFr
4bd0: 65 65 28 70 41 67 67 2d 3e 61 70 46 75 6e 63 29  ee(pAgg->apFunc)
4be0: 3b 0a 20 20 70 41 67 67 2d 3e 61 70 46 75 6e 63  ;.  pAgg->apFunc
4bf0: 20 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e 70 43   = 0;.  pAgg->pC
4c00: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 70 41  urrent = 0;.  pA
4c10: 67 67 2d 3e 70 53 65 61 72 63 68 20 3d 20 30 3b  gg->pSearch = 0;
4c20: 0a 20 20 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20  .  pAgg->nMem = 
4c30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
4c40: 74 65 20 61 20 6b 65 79 6c 69 73 74 0a 2a 2f 0a  te a keylist.*/.
4c50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4c60: 4b 65 79 6c 69 73 74 46 72 65 65 28 4b 65 79 6c  KeylistFree(Keyl
4c70: 69 73 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ist *p){.  while
4c80: 28 20 70 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69  ( p ){.    Keyli
4c90: 73 74 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70  st *pNext = p->p
4ca0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
4cb0: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 70 20 3d  Free(p);.    p =
4cc0: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pNext;.  }.}../
4cd0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
4ce0: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
4cf0: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
4d00: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 68 61  s that cursor ha
4d10: 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64  ppens.** to hold
4d20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4d30: 33 56 64 62 65 43 6c 65 61 6e 75 70 43 75 72 73  3VdbeCleanupCurs
4d40: 6f 72 28 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  or(Cursor *pCx){
4d50: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
4d60: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
4d70: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
4d80: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
4d90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
4da0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
4db0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
4dc0: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73  x->pBt);.  }.  s
4dd0: 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 70  qliteFree(pCx->p
4de0: 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  Data);.  sqliteF
4df0: 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b  ree(pCx->aType);
4e00: 0a 20 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30  .  memset(pCx, 0
4e10: 2c 20 73 69 7a 65 6f 66 28 2a 70 43 78 29 29 3b  , sizeof(*pCx));
4e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
4e30: 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73  all cursors.*/.s
4e40: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
4e50: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
4e60: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4e70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4e80: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
4e90: 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d   Cursor *pC = p-
4ea0: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 73  >apCsr[i];.    s
4eb0: 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 6e 75  qlite3VdbeCleanu
4ec0: 70 43 75 72 73 6f 72 28 70 43 29 3b 0a 20 20 20  pCursor(pC);.   
4ed0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 29 3b   sqliteFree(pC);
4ee0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
4ef0: 65 28 70 2d 3e 61 70 43 73 72 29 3b 0a 20 20 70  e(p->apCsr);.  p
4f00: 2d 3e 61 70 43 73 72 20 3d 20 30 3b 0a 20 20 70  ->apCsr = 0;.  p
4f10: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 7d  ->nCursor = 0;.}
4f20: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
4f30: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
4f40: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
4f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
4f60: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
4f70: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
4f80: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
4f90: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
4fa0: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
4fb0: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
4fc0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
4fd0: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
4fe0: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
4ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5000: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
5010: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
5020: 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20   p->aStack ){.  
5030: 20 20 4d 65 6d 20 2a 70 54 6f 73 20 3d 20 70 2d    Mem *pTos = p-
5040: 3e 70 54 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65  >pTos;.    while
5050: 28 20 70 54 6f 73 3e 3d 70 2d 3e 61 53 74 61 63  ( pTos>=p->aStac
5060: 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  k ){.      if( p
5070: 54 6f 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Tos->flags & MEM
5080: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  _Dyn ){.        
5090: 73 71 6c 69 74 65 46 72 65 65 28 70 54 6f 73 2d  sqliteFree(pTos-
50a0: 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >z);.      }.   
50b0: 20 20 20 70 54 6f 73 2d 2d 3b 0a 20 20 20 20 7d     pTos--;.    }
50c0: 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70  .    p->pTos = p
50d0: 54 6f 73 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  Tos;.  }.  close
50e0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
50f0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
5100: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5110: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
5120: 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 5b      if( p->aMem[
5130: 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  i].flags & MEM_D
5140: 79 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  yn ){.        sq
5150: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d  liteFree(p->aMem
5160: 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  [i].z);.      }.
5170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
5180: 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d 29 3b  teFree(p->aMem);
5190: 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 30 3b 0a  .  p->aMem = 0;.
51a0: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20    p->nMem = 0;. 
51b0: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
51c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
51d0: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 70  KeylistFree(p->p
51e0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 4c  List);.    p->pL
51f0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ist = 0;.  }.  s
5200: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
5210: 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20  Reset(p);.  if( 
5220: 70 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  p->pFile ){.    
5230: 69 66 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73 74  if( p->pFile!=st
5240: 64 69 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d 3e  din ) fclose(p->
5250: 70 46 69 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 70  pFile);.    p->p
5260: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
5270: 69 66 28 20 70 2d 3e 61 7a 46 69 65 6c 64 20 29  if( p->azField )
5280: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5290: 28 70 2d 3e 61 7a 46 69 65 6c 64 29 3b 0a 20 20  (p->azField);.  
52a0: 20 20 70 2d 3e 61 7a 46 69 65 6c 64 20 3d 20 30    p->azField = 0
52b0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c  ;.  }.  p->nFiel
52c0: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  d = 0;.  if( p->
52d0: 7a 4c 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c  zLine ){.    sql
52e0: 69 74 65 46 72 65 65 28 70 2d 3e 7a 4c 69 6e 65  iteFree(p->zLine
52f0: 29 3b 0a 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 20  );.    p->zLine 
5300: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c  = 0;.  }.  p->nL
5310: 69 6e 65 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ineAlloc = 0;.  
5320: 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 52 65  sqlite3VdbeAggRe
5330: 73 65 74 28 26 70 2d 3e 61 67 67 29 3b 0a 20 20  set(&p->agg);.  
5340: 69 66 28 20 70 2d 3e 61 53 65 74 20 29 7b 0a 20  if( p->aSet ){. 
5350: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5360: 3e 6e 53 65 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSet; i++){.   
5370: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
5380: 65 61 72 28 26 70 2d 3e 61 53 65 74 5b 69 5d 2e  ear(&p->aSet[i].
5390: 68 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hash);.    }.  }
53a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
53b0: 3e 61 53 65 74 29 3b 0a 20 20 70 2d 3e 61 53 65  >aSet);.  p->aSe
53c0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 53 65 74  t = 0;.  p->nSet
53d0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6b   = 0;.  if( p->k
53e0: 65 79 6c 69 73 74 53 74 61 63 6b 20 29 7b 0a 20  eylistStack ){. 
53f0: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
5400: 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 20 3c 20  or(ii = 0; ii < 
5410: 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44  p->keylistStackD
5420: 65 70 74 68 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  epth; ii++){.   
5430: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65     sqlite3VdbeKe
5440: 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 6b 65 79  ylistFree(p->key
5450: 6c 69 73 74 53 74 61 63 6b 5b 69 69 5d 29 3b 0a  listStack[ii]);.
5460: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5470: 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53  Free(p->keylistS
5480: 74 61 63 6b 29 3b 0a 20 20 20 20 70 2d 3e 6b 65  tack);.    p->ke
5490: 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74 68 20  ylistStackDepth 
54a0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c  = 0;.    p->keyl
54b0: 69 73 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  istStack = 0;.  
54c0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
54d0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b  ->contextStack);
54e0: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
54f0: 63 6b 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ck = 0;.  sqlite
5500: 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29  Free(p->zErrMsg)
5510: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
5520: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
5530: 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
5540: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
5550: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
5560: 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
5570: 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
5580: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
5590: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
55a0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
55b0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
55c0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
55d0: 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
55e0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
55f0: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
5600: 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2f 0a 69 6e 74  ** again..*/.int
5610: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
5620: 74 28 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20  t(Vdbe *p, char 
5630: 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73  **pzErrMsg){.  s
5640: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 2d 3e 64  qlite *db = p->d
5650: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  b;.  int i;..  i
5660: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
5670: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
5680: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
5690: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
56a0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
56b0: 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  (pzErrMsg, sqlit
56c0: 65 33 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  e3_error_string(
56d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 2c 20  SQLITE_MISUSE), 
56e0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
56f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
5700: 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  USE;.  }.  if( p
5710: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
5720: 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 26 26   if( pzErrMsg &&
5730: 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b   *pzErrMsg==0 ){
5740: 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  .      *pzErrMsg
5750: 20 3d 20 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20   = p->zErrMsg;. 
5760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5770: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45  sqliteFree(p->zE
5780: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
5790: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
57a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
57b0: 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >rc ){.    sqlit
57c0: 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  e3SetString(pzEr
57d0: 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
57e0: 72 6f 72 5f 73 74 72 69 6e 67 28 70 2d 3e 72 63  ror_string(p->rc
57f0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
5800: 7d 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  }.  Cleanup(p);.
5810: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
5820: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77  ITE_OK ){.    sw
5830: 69 74 63 68 28 20 70 2d 3e 65 72 72 6f 72 41 63  itch( p->errorAc
5840: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 63 61  tion ){.      ca
5850: 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 7b 0a 20  se OE_Abort: {. 
5860: 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 75         if( !p->u
5870: 6e 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20  ndoTransOnError 
5880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
5890: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
58a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
58b0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
58c0: 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ].pBt ){.       
58d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
58e0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28  reeRollbackStmt(
58f0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
5900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5910: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
5940: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   Fall through to
5950: 20 52 4f 4c 4c 42 41 43 4b 20 2a 2f 0a 20 20 20   ROLLBACK */.   
5960: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5970: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 7b 0a 20  OE_Rollback: {. 
5980: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
5990: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
59a0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
59b0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
59c0: 61 6e 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  ans;.        db-
59d0: 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65  >onError = OE_De
59e0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 62  fault;.        b
59f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5a00: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5a10: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 75 6e         if( p->un
5a20: 64 6f 54 72 61 6e 73 4f 6e 45 72 72 6f 72 20 29  doTransOnError )
5a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5a40: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
5a50: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
5a60: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
5a70: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 20 20  TE_InTrans;.    
5a80: 20 20 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f        db->onErro
5a90: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
5aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5ad0: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
5ae0: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
5af0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
5b00: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
5b10: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
5b20: 5d 2e 70 42 74 20 26 26 20 64 62 2d 3e 61 44 62  ].pBt && db->aDb
5b30: 5b 69 5d 2e 69 6e 54 72 61 6e 73 3d 3d 32 20 29  [i].inTrans==2 )
5b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
5b50: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 64  treeCommitStmt(d
5b60: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
5b70: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
5b80: 2e 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20  .inTrans = 1;.  
5b90: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5ba0: 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53  ( p->pTos<&p->aS
5bb0: 74 61 63 6b 5b 70 2d 3e 70 63 5d 20 7c 7c 20 73  tack[p->pc] || s
5bc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
5bd0: 69 6c 65 64 3d 3d 31 20 29 3b 0a 23 69 66 64 65  iled==1 );.#ifde
5be0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
5bf0: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
5c00: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
5c10: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
5c20: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
5c30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
5c40: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
5c50: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
5c60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5c70: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
5c80: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
5c90: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
5ca0: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
5cb0: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
5cc0: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
5cd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5ce0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5cf0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5d00: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
5d10: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
5d20: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
5d30: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
5d40: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
5d50: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
5d60: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
5d70: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
5d80: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
5d90: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
5da0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5db0: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
5dc0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
5dd0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
5de0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
5df0: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
5e00: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
5e10: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
5e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
5e30: 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
5e40: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
5e50: 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
5e60: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
5e70: 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
5e80: 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
5e90: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
5ea0: 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
5eb0: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
5ec0: 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
5ed0: 56 64 62 65 20 2a 70 2c 20 63 68 61 72 20 2a 2a  Vdbe *p, char **
5ee0: 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69 6e 74  pzErrMsg){.  int
5ef0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   rc;.  sqlite *d
5f00: 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  b;..  if( p->mag
5f10: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
5f20: 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d  UN && p->magic!=
5f30: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
5f40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
5f50: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
5f60: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6f 72 5f  , sqlite3_error_
5f70: 73 74 72 69 6e 67 28 53 51 4c 49 54 45 5f 4d 49  string(SQLITE_MI
5f80: 53 55 53 45 29 2c 20 28 63 68 61 72 2a 29 30 29  SUSE), (char*)0)
5f90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5fa0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
5fb0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
5fc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
5fd0: 52 65 73 65 74 28 70 2c 20 70 7a 45 72 72 4d 73  Reset(p, pzErrMs
5fe0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  g);.  sqlite3Vdb
5ff0: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 69 66  eDelete(p);.  if
6000: 28 20 64 62 2d 3e 77 61 6e 74 5f 74 6f 5f 63 6c  ( db->want_to_cl
6010: 6f 73 65 20 26 26 20 64 62 2d 3e 70 56 64 62 65  ose && db->pVdbe
6020: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6030: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
6040: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6050: 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20  TE_SCHEMA ){.   
6060: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
6070: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
6080: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
6090: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
60a0: 62 69 6e 64 20 74 68 65 20 76 61 6c 75 65 20 62  bind the value b
60b0: 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65  ound to variable
60c0: 20 24 69 20 69 6e 20 76 69 72 74 75 61 6c 20 6d   $i in virtual m
60d0: 61 63 68 69 6e 65 20 70 2e 20 54 68 69 73 20 69  achine p. This i
60e0: 73 20 74 68 65 20 0a 2a 2a 20 74 68 65 20 73 61  s the .** the sa
60f0: 6d 65 20 61 73 20 62 69 6e 64 69 6e 67 20 61 20  me as binding a 
6100: 4e 55 4c 4c 20 76 61 6c 75 65 20 74 6f 20 74 68  NULL value to th
6110: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  e column..*/.sta
6120: 74 69 63 20 69 6e 74 20 76 64 62 65 55 6e 62 69  tic int vdbeUnbi
6130: 6e 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nd(Vdbe *p, int 
6140: 69 29 7b 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b  i){.  Mem *pVar;
6150: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
6160: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
6170: 7c 7c 20 70 2d 3e 70 63 21 3d 30 20 29 7b 0a 20  || p->pc!=0 ){. 
6180: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6190: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69  _MISUSE;.  }.  i
61a0: 66 28 20 69 3c 31 20 7c 7c 20 69 3e 70 2d 3e 6e  f( i<1 || i>p->n
61b0: 56 61 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Var ){.    retur
61c0: 6e 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3b 0a  n SQLITE_RANGE;.
61d0: 20 20 7d 0a 20 20 69 2d 2d 3b 0a 20 20 70 56 61    }.  i--;.  pVa
61e0: 72 20 3d 20 26 70 2d 3e 61 70 56 61 72 5b 69 5d  r = &p->apVar[i]
61f0: 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 66 6c  ;.  if( pVar->fl
6200: 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20  ags&MEM_Dyn ){. 
6210: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 56     sqliteFree(pV
6220: 61 72 2d 3e 7a 29 3b 0a 20 20 7d 0a 20 20 70 56  ar->z);.  }.  pV
6230: 61 72 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ar->flags = MEM_
6240: 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53  Null;.  return S
6250: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6260: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6270: 69 73 20 75 73 65 64 20 74 6f 20 62 69 6e 64 20  is used to bind 
6280: 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 64 61 74  text or blob dat
6290: 61 20 74 6f 20 61 6e 20 53 51 4c 20 76 61 72 69  a to an SQL vari
62a0: 61 62 6c 65 20 28 61 20 3f 29 2e 0a 2a 2a 20 49  able (a ?)..** I
62b0: 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 75 73  t may also be us
62c0: 65 64 20 74 6f 20 62 69 6e 64 20 61 20 4e 55 4c  ed to bind a NUL
62d0: 4c 20 76 61 6c 75 65 2c 20 62 79 20 73 65 74 74  L value, by sett
62e0: 69 6e 67 20 7a 56 61 6c 20 74 6f 20 30 2e 0a 2a  ing zVal to 0..*
62f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
6300: 65 42 69 6e 64 42 6c 6f 62 28 0a 20 20 56 64 62  eBindBlob(.  Vdb
6310: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6320: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
6330: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ne */.  int i,  
6340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
6350: 72 20 6e 75 6d 62 65 72 20 74 6f 20 62 69 6e 64  r number to bind
6360: 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20   (numbered from 
6370: 31 20 75 70 77 61 72 64 29 20 2a 2f 0a 20 20 63  1 upward) */.  c
6380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 2c  onst char *zVal,
6390: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
63a0: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a  blob of data */.
63b0: 20 20 69 6e 74 20 62 79 74 65 73 2c 20 20 20 20    int bytes,    
63c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
63d0: 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
63e0: 2a 2f 0a 20 20 69 6e 74 20 63 6f 70 79 2c 20 20  */.  int copy,  
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
6400: 74 6f 20 63 6f 70 79 20 74 68 65 20 6d 65 6d 6f  to copy the memo
6410: 72 79 2c 20 66 61 6c 73 65 20 74 6f 20 63 6f 70  ry, false to cop
6420: 79 20 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  y a pointer */. 
6430: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
6440: 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 63 6f 6d      /* Valid com
6450: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4d 45 4d 5f  bination of MEM_
6460: 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72 2c 20 4d  Blob, MEM_Str, M
6470: 45 4d 5f 55 74 66 58 58 20 2a 2f 0a 29 7b 0a 20  EM_UtfXX */.){. 
6480: 20 4d 65 6d 20 2a 70 56 61 72 3b 0a 0a 20 20 76   Mem *pVar;..  v
6490: 64 62 65 55 6e 62 69 6e 64 28 70 2c 20 69 29 3b  dbeUnbind(p, i);
64a0: 0a 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 70  .  pVar = &p->ap
64b0: 56 61 72 5b 69 2d 31 5d 3b 0a 0a 20 20 69 66 28  Var[i-1];..  if(
64c0: 20 7a 56 61 6c 20 29 7b 0a 20 20 20 20 70 56 61   zVal ){.    pVa
64d0: 72 2d 3e 6e 20 3d 20 62 79 74 65 73 3b 0a 20 20  r->n = bytes;.  
64e0: 20 20 70 56 61 72 2d 3e 66 6c 61 67 73 20 3d 20    pVar->flags = 
64f0: 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 21  flags;.    if( !
6500: 63 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 70 56  copy ){.      pV
6510: 61 72 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  ar->z = (char *)
6520: 7a 56 61 6c 3b 0a 20 20 20 20 20 20 70 56 61 72  zVal;.      pVar
6530: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
6540: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
6550: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 79 74 65  {.      if( byte
6560: 73 3e 4e 42 46 53 20 29 7b 0a 20 20 20 20 20 20  s>NBFS ){.      
6570: 20 20 70 56 61 72 2d 3e 7a 20 3d 20 28 63 68 61    pVar->z = (cha
6580: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
6590: 28 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20  (bytes);.       
65a0: 20 69 66 28 20 21 70 56 61 72 2d 3e 7a 20 29 7b   if( !pVar->z ){
65b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
65c0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
65d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65e0: 20 20 70 56 61 72 2d 3e 66 6c 61 67 73 20 7c 3d    pVar->flags |=
65f0: 20 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 20 20   MEM_Dyn;.      
6600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6610: 56 61 72 2d 3e 7a 20 3d 20 70 56 61 72 2d 3e 7a  Var->z = pVar->z
6620: 53 68 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 70  Short;.        p
6630: 56 61 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Var->flags |= ME
6640: 4d 5f 53 68 6f 72 74 3b 0a 20 20 20 20 20 20 7d  M_Short;.      }
6650: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 56  .      memcpy(pV
6660: 61 72 2d 3e 7a 2c 20 7a 56 61 6c 2c 20 62 79 74  ar->z, zVal, byt
6670: 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  es);.    }.  }..
6680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6690: 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  OK;.}..int sqlit
66a0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 73 71  e3_bind_int64(sq
66b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 2c 20 69  lite3_stmt *p, i
66c0: 6e 74 20 69 2c 20 6c 6f 6e 67 20 6c 6f 6e 67 20  nt i, long long 
66d0: 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 69  int iValue){.  i
66e0: 6e 74 20 72 63 3b 0a 20 20 56 64 62 65 20 2a 76  nt rc;.  Vdbe *v
66f0: 20 3d 20 28 56 64 62 65 20 2a 29 70 3b 0a 20 20   = (Vdbe *)p;.  
6700: 72 63 20 3d 20 76 64 62 65 55 6e 62 69 6e 64 28  rc = vdbeUnbind(
6710: 76 2c 20 69 29 3b 0a 20 20 69 66 28 20 72 63 3d  v, i);.  if( rc=
6720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6730: 20 20 4d 65 6d 20 2a 70 56 61 72 20 3d 20 26 76    Mem *pVar = &v
6740: 2d 3e 61 70 56 61 72 5b 69 2d 31 5d 3b 0a 20 20  ->apVar[i-1];.  
6750: 20 20 70 56 61 72 2d 3e 66 6c 61 67 73 20 3d 20    pVar->flags = 
6760: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 56 61  MEM_Int;.    pVa
6770: 72 2d 3e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20  r->i = iValue;. 
6780: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6790: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71  TE_OK;.}..int sq
67a0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 33 32  lite3_bind_int32
67b0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
67c0: 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 69 56 61  , int i, int iVa
67d0: 6c 75 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  lue){.  return s
67e0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
67f0: 34 28 70 2c 20 69 2c 20 28 6c 6f 6e 67 20 6c 6f  4(p, i, (long lo
6800: 6e 67 20 69 6e 74 29 69 56 61 6c 75 65 29 3b 0a  ng int)iValue);.
6810: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  }..int sqlite3_b
6820: 69 6e 64 5f 64 6f 75 62 6c 65 28 73 71 6c 69 74  ind_double(sqlit
6830: 65 33 5f 73 74 6d 74 20 2a 70 2c 20 69 6e 74 20  e3_stmt *p, int 
6840: 69 2c 20 64 6f 75 62 6c 65 20 69 56 61 6c 75 65  i, double iValue
6850: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56  ){.  int rc;.  V
6860: 64 62 65 20 2a 76 20 3d 20 28 56 64 62 65 20 2a  dbe *v = (Vdbe *
6870: 29 70 3b 0a 20 20 72 63 20 3d 20 76 64 62 65 55  )p;.  rc = vdbeU
6880: 6e 62 69 6e 64 28 76 2c 20 69 29 3b 0a 20 20 69  nbind(v, i);.  i
6890: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
68a0: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 56 61   ){.    Mem *pVa
68b0: 72 20 3d 20 26 76 2d 3e 61 70 56 61 72 5b 69 2d  r = &v->apVar[i-
68c0: 31 5d 3b 0a 20 20 20 20 70 56 61 72 2d 3e 66 6c  1];.    pVar->fl
68d0: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
68e0: 20 20 20 20 70 56 61 72 2d 3e 72 20 3d 20 69 56      pVar->r = iV
68f0: 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  alue;.  }.  retu
6900: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6910: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e  .int sqlite3_bin
6920: 64 5f 6e 75 6c 6c 28 73 71 6c 69 74 65 33 5f 73  d_null(sqlite3_s
6930: 74 6d 74 2a 20 70 2c 20 69 6e 74 20 69 29 7b 0a  tmt* p, int i){.
6940: 20 20 72 65 74 75 72 6e 20 76 64 62 65 55 6e 62    return vdbeUnb
6950: 69 6e 64 28 28 56 64 62 65 20 2a 29 70 2c 20 69  ind((Vdbe *)p, i
6960: 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  );.}..int sqlite
6970: 33 5f 62 69 6e 64 5f 74 65 78 74 28 20 0a 20 20  3_bind_text( .  
6980: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 2c  sqlite3_stmt *p,
6990: 20 0a 20 20 69 6e 74 20 69 2c 20 0a 20 20 63 6f   .  int i, .  co
69a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 2c  nst char *zData,
69b0: 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a   .  int nData, .
69c0: 20 20 69 6e 74 20 65 43 6f 70 79 0a 29 7b 0a 20    int eCopy.){. 
69d0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 4d 45 4d   int flags = MEM
69e0: 5f 53 74 72 7c 4d 45 4d 5f 55 74 66 38 3b 0a 20  _Str|MEM_Utf8;. 
69f0: 20 69 66 28 20 7a 44 61 74 61 20 29 7b 0a 20 20   if( zData ){.  
6a00: 20 20 69 66 28 20 6e 44 61 74 61 3c 30 20 29 7b    if( nData<0 ){
6a10: 0a 20 20 20 20 20 20 6e 44 61 74 61 20 3d 20 73  .      nData = s
6a20: 74 72 6c 65 6e 28 7a 44 61 74 61 29 2b 31 3b 0a  trlen(zData)+1;.
6a30: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 4d        flags |= M
6a40: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c  EM_Term;.    }el
6a50: 73 65 20 69 66 28 20 21 7a 44 61 74 61 5b 6e 44  se if( !zData[nD
6a60: 61 74 61 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  ata-1] ){.      
6a70: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72  flags |= MEM_Ter
6a80: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
6a90: 65 74 75 72 6e 20 76 64 62 65 42 69 6e 64 42 6c  eturn vdbeBindBl
6aa0: 6f 62 28 28 56 64 62 65 20 2a 29 70 2c 20 69 2c  ob((Vdbe *)p, i,
6ab0: 20 7a 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 65   zData, nData, e
6ac0: 43 6f 70 79 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Copy, flags);.}.
6ad0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e  .int sqlite3_bin
6ae0: 64 5f 74 65 78 74 31 36 28 0a 20 20 73 71 6c 69  d_text16(.  sqli
6af0: 74 65 33 5f 73 74 6d 74 20 2a 70 2c 20 0a 20 20  te3_stmt *p, .  
6b00: 69 6e 74 20 69 2c 20 0a 20 20 63 6f 6e 73 74 20  int i, .  const 
6b10: 76 6f 69 64 20 2a 7a 44 61 74 61 2c 20 0a 20 20  void *zData, .  
6b20: 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20 69 6e  int nData, .  in
6b30: 74 20 65 43 6f 70 79 0a 29 7b 0a 20 20 69 6e 74  t eCopy.){.  int
6b40: 20 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72   flags = MEM_Str
6b50: 7c 4d 45 4d 5f 55 74 66 31 36 6c 65 7c 4d 45 4d  |MEM_Utf16le|MEM
6b60: 5f 55 74 66 31 36 62 65 3b 0a 0a 20 20 69 66 28  _Utf16be;..  if(
6b70: 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a   zData ){.    /*
6b80: 20 49 66 20 6e 44 61 74 61 20 69 73 20 6c 65 73   If nData is les
6b90: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 6d 65 61  s than zero, mea
6ba0: 73 75 72 65 20 74 68 65 20 6c 65 6e 67 74 68 20  sure the length 
6bb0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 2e 20 0a  of the string. .
6bc0: 20 20 20 20 2a 2a 20 6d 61 6e 75 61 6c 6c 79 2e      ** manually.
6bd0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
6be0: 65 20 76 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  e variable will 
6bf0: 61 6c 77 61 79 73 20 62 65 20 6e 75 6c 6c 20 74  always be null t
6c00: 65 72 6d 69 6e 61 74 65 64 2e 0a 20 20 20 20 2a  erminated..    *
6c10: 2f 0a 20 20 20 20 69 66 28 20 6e 44 61 74 61 3c  /.    if( nData<
6c20: 30 20 29 7b 0a 20 20 20 20 20 20 6e 44 61 74 61  0 ){.      nData
6c30: 20 3d 20 73 71 6c 69 74 65 33 75 74 66 31 36 42   = sqlite3utf16B
6c40: 79 74 65 4c 65 6e 28 7a 44 61 74 61 29 20 2b 20  yteLen(zData) + 
6c50: 32 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  2;.      flags |
6c60: 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  = MEM_Term;.    
6c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
6c80: 49 66 20 6e 44 61 74 61 20 69 73 20 67 72 65 61  If nData is grea
6c90: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 63  ter than zero, c
6ca0: 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6e 61  heck if the fina
6cb0: 6c 20 63 68 61 72 61 63 74 65 72 20 61 70 70 65  l character appe
6cc0: 61 72 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ars.      ** to 
6cd0: 62 65 20 61 20 74 65 72 6d 69 6e 61 74 6f 72 2e  be a terminator.
6ce0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6cf0: 69 66 28 20 21 28 28 28 75 38 20 2a 29 7a 44 61  if( !(((u8 *)zDa
6d00: 74 61 29 5b 6e 44 61 74 61 2d 31 5d 29 20 26 26  ta)[nData-1]) &&
6d10: 20 21 28 28 28 75 38 20 2a 29 7a 44 61 74 61 29   !(((u8 *)zData)
6d20: 5b 6e 44 61 74 61 2d 32 5d 29 20 29 7b 0a 20 20  [nData-2]) ){.  
6d30: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 4d        flags |= M
6d40: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  EM_Term;.      }
6d50: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 0a 20  .    }.  }  . . 
6d60: 20 72 65 74 75 72 6e 20 76 64 62 65 42 69 6e 64   return vdbeBind
6d70: 42 6c 6f 62 28 28 56 64 62 65 20 2a 29 70 2c 20  Blob((Vdbe *)p, 
6d80: 69 2c 20 7a 44 61 74 61 2c 20 6e 44 61 74 61 2c  i, zData, nData,
6d90: 20 65 43 6f 70 79 2c 20 66 6c 61 67 73 29 3b 0a   eCopy, flags);.
6da0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  }..int sqlite3_b
6db0: 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 73 71 6c 69  ind_blob(.  sqli
6dc0: 74 65 33 5f 73 74 6d 74 20 2a 70 2c 20 0a 20 20  te3_stmt *p, .  
6dd0: 69 6e 74 20 69 2c 20 0a 20 20 63 6f 6e 73 74 20  int i, .  const 
6de0: 76 6f 69 64 20 2a 7a 44 61 74 61 2c 20 0a 20 20  void *zData, .  
6df0: 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20 69 6e  int nData, .  in
6e00: 74 20 65 43 6f 70 79 0a 29 7b 0a 20 20 72 65 74  t eCopy.){.  ret
6e10: 75 72 6e 20 76 64 62 65 42 69 6e 64 42 6c 6f 62  urn vdbeBindBlob
6e20: 28 28 56 64 62 65 20 2a 29 70 2c 20 69 2c 20 7a  ((Vdbe *)p, i, z
6e30: 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 65 43 6f  Data, nData, eCo
6e40: 70 79 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 7d  py, MEM_Blob);.}
6e50: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
6e60: 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 76 61  values of all va
6e70: 72 69 61 62 6c 65 73 2e 20 20 56 61 72 69 61 62  riables.  Variab
6e80: 6c 65 20 24 31 20 69 6e 20 74 68 65 20 6f 72 69  le $1 in the ori
6e90: 67 69 6e 61 6c 20 53 51 4c 20 77 69 6c 6c 0a 2a  ginal SQL will.*
6ea0: 2a 20 62 65 20 74 68 65 20 73 74 72 69 6e 67 20  * be the string 
6eb0: 61 7a 56 61 6c 75 65 5b 30 5d 2e 20 20 24 32 20  azValue[0].  $2 
6ec0: 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 76 61  will have the va
6ed0: 6c 75 65 20 61 7a 56 61 6c 75 65 5b 31 5d 2e 20  lue azValue[1]. 
6ee0: 20 41 6e 64 0a 2a 2a 20 73 6f 20 66 6f 72 74 68   And.** so forth
6ef0: 2e 20 20 49 66 20 61 20 76 61 6c 75 65 20 69 73  .  If a value is
6f00: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 66   out of range (f
6f10: 6f 72 20 65 78 61 6d 70 6c 65 20 24 33 20 77 68  or example $3 wh
6f20: 65 6e 20 6e 56 61 6c 75 65 3d 3d 32 29 0a 2a 2a  en nValue==2).**
6f30: 20 74 68 65 6e 20 69 74 73 20 76 61 6c 75 65 20   then its value 
6f40: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a  will be NULL..**
6f50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6f60: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
6f70: 72 69 6f 72 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e  rior call..*/.in
6f80: 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 28 73  t sqlite3_bind(s
6f90: 71 6c 69 74 65 5f 76 6d 20 2a 70 56 6d 2c 20 69  qlite_vm *pVm, i
6fa0: 6e 74 20 69 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt i, const char
6fb0: 20 2a 7a 56 61 6c 2c 20 69 6e 74 20 6c 65 6e 2c   *zVal, int len,
6fc0: 20 69 6e 74 20 63 6f 70 79 29 7b 0a 20 20 72 65   int copy){.  re
6fd0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e  turn sqlite3_bin
6fe0: 64 5f 74 65 78 74 28 70 56 6d 2c 20 69 2c 20 7a  d_text(pVm, i, z
6ff0: 56 61 6c 2c 20 6c 65 6e 2c 20 63 6f 70 79 29 3b  Val, len, copy);
7000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
7010: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
7020: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7030: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
7040: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7050: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7060: 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  n;.  Cleanup(p);
7070: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
7080: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
7090: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
70a0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
70b0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70  assert( p->db->p
70c0: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Vdbe==p );.    p
70d0: 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d  ->db->pVdbe = p-
70e0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
70f0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
7100: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
7110: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
7120: 7d 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70  }.  p->pPrev = p
7130: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69  ->pNext = 0;.  i
7140: 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d  f( p->nOpAlloc==
7150: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 20  0 ){.    p->aOp 
7160: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 20  = 0;.    p->nOp 
7170: 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 0;.  }.  for(i
7180: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
7190: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  +){.    if( p->a
71a0: 4f 70 5b 69 5d 2e 70 33 74 79 70 65 3d 3d 50 33  Op[i].p3type==P3
71b0: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
71c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
71d0: 61 4f 70 5b 69 5d 2e 70 33 29 3b 0a 20 20 20 20  aOp[i].p3);.    
71e0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
71f0: 20 69 3c 70 2d 3e 6e 56 61 72 3b 20 69 2b 2b 29   i<p->nVar; i++)
7200: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 70 56  {.    if( p->apV
7210: 61 72 5b 69 5d 2e 66 6c 61 67 73 26 4d 45 4d 5f  ar[i].flags&MEM_
7220: 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Dyn ){.      sql
7230: 69 74 65 46 72 65 65 28 70 2d 3e 61 70 56 61 72  iteFree(p->apVar
7240: 5b 69 5d 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  [i].z);.    }.  
7250: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
7260: 2d 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->aOp);.  sqlite
7270: 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  Free(p->aLabel);
7280: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
7290: 3e 61 53 74 61 63 6b 29 3b 0a 20 20 70 2d 3e 6d  >aStack);.  p->m
72a0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
72b0: 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65  C_DEAD;.  sqlite
72c0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
72d0: 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
72e0: 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
72f0: 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
7300: 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
7310: 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
7320: 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ow.  Return an e
7330: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e  rror code.  If n
7340: 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64  o MoveTo is pend
7350: 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  ing, this.** rou
7360: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e  tine does nothin
7370: 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  g and returns SQ
7380: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
7390: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
73a0: 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a  rMoveto(Cursor *
73b0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
73c0: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
73d0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
73e0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
73f0: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
7400: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
7410: 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 69 66  intKey );.    if
7420: 28 20 70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  ( p->intKey ){. 
7430: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
7440: 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73  eMoveto(p->pCurs
7450: 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f  or, 0, p->moveto
7460: 54 61 72 67 65 74 2c 20 26 72 65 73 29 3b 0a 20  Target, &res);. 
7470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7480: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
7490: 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63  to(p->pCursor,(c
74a0: 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54  har*)&p->movetoT
74b0: 61 72 67 65 74 2c 73 69 7a 65 6f 66 28 69 36 34  arget,sizeof(i64
74c0: 29 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20  ),&res);.    }. 
74d0: 20 20 20 70 2d 3e 69 6e 63 72 4b 65 79 20 3d 20     p->incrKey = 
74e0: 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 65  0;.    p->lastRe
74f0: 63 6e 6f 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70  cno = keyToInt(p
7500: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b  ->movetoTarget);
7510: 0a 20 20 20 20 70 2d 3e 72 65 63 6e 6f 49 73 56  .    p->recnoIsV
7520: 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20  alid = res==0;. 
7530: 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
7540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7550: 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f  eeNext(p->pCurso
7560: 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a  r, &res);.    }.
7570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
7580: 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  ch_count++;.    
7590: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
75a0: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
75b0: 63 68 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  cheValid = 0;.  
75c0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
75d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
75e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
75f0: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
7600: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
7610: 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
7620: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
7630: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
7640: 62 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a  beSerialRead().*
7650: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
7660: 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
7670: 74 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69  te3VdbeSerialWri
7680: 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  te().**.** encap
7690: 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
76a0: 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
76b0: 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
76c0: 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
76d0: 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
76e0: 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
76f0: 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
7700: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
7710: 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
7720: 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
7730: 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
7740: 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
7750: 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
7760: 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
7770: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
7780: 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
7790: 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
77a0: 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
77b0: 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
77c0: 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
77d0: 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
77e0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
77f0: 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
7800: 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
7810: 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
7820: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
7830: 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
7840: 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
7850: 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
7860: 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
7870: 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
7880: 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
7890: 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
78a0: 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
78b0: 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a  ob seperately..*
78c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
78d0: 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
78e0: 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
78f0: 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
7900: 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
7910: 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
7920: 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
7930: 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
7940: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
7950: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
7960: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
7970: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 2d 20 20 20 20 20 20 20 20 20 20       -          
79a0: 20 20 4e 6f 74 20 61 20 74 79 70 65 2e 0a 2a 2a    Not a type..**
79b0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
79d0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
79e0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
79f0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
7a00: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
7a10: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
7a20: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
7a50: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
7a60: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
7a70: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
7a80: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
7a90: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
7ac0: 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
7ad0: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
7ae0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
7af0: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
7b00: 20 20 20 37 2e 2e 31 31 20 20 20 20 20 20 20 20     7..11        
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
7b30: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
7b40: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
7b50: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
7b60: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
7b70: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
7b80: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
7b90: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
7ba0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
7bb0: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
7bc0: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
7bd0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
7be0: 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 56 64  */.u64 sqlite3Vd
7bf0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 63 6f 6e  beSerialType(con
7c00: 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  st Mem *pMem){. 
7c10: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
7c20: 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 69 66 28  m->flags;..  if(
7c30: 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
7c40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  ){.    return 6;
7c50: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
7c60: 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
7c70: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
7c80: 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
7c90: 32 2c 20 34 20 6f 72 20 38 20 62 79 74 65 73 2e  2, 4 or 8 bytes.
7ca0: 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 20 3d 20   */.    i64 i = 
7cb0: 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 69 66 28  pMem->i;.    if(
7cc0: 20 69 3e 3d 2d 31 32 37 20 26 26 20 69 3c 3d 31   i>=-127 && i<=1
7cd0: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
7ce0: 20 20 20 69 66 28 20 69 3e 3d 2d 33 32 37 36 37     if( i>=-32767
7cf0: 20 26 26 20 69 3c 3d 33 32 37 36 37 20 29 20 72   && i<=32767 ) r
7d00: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
7d10: 20 69 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   i>=-2147483647 
7d20: 26 26 20 69 3c 3d 32 31 34 37 34 38 33 36 34 37  && i<=2147483647
7d30: 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
7d40: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 7d 0a 20   return 4;.  }. 
7d50: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
7d60: 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
7d70: 6e 20 35 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 5;.  }.  if( f
7d80: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
7d90: 20 20 20 20 2f 2a 20 57 65 20 61 73 73 75 6d 65      /* We assume
7da0: 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67   that the string
7db0: 20 69 73 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61   is NULL-termina
7dc0: 74 65 64 2e 20 57 65 20 64 6f 6e 27 74 20 73 74  ted. We don't st
7dd0: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 4e  ore the.    ** N
7de0: 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 2d  ULL-terminator -
7df0: 20 69 74 20 69 73 20 69 6d 70 6c 69 65 64 20 62   it is implied b
7e00: 79 20 74 68 65 20 73 74 72 69 6e 67 20 73 74 6f  y the string sto
7e10: 72 61 67 65 20 63 6c 61 73 73 2e 0a 20 20 20 20  rage class..    
7e20: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
7e30: 4d 65 6d 2d 3e 6e 3e 30 20 29 3b 0a 20 20 20 20  Mem->n>0 );.    
7e40: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 5b  assert( pMem->z[
7e50: 70 4d 65 6d 2d 3e 6e 2d 31 5d 3d 3d 27 5c 30 27  pMem->n-1]=='\0'
7e60: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
7e70: 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 31 29 3b  pMem->n*2 + 11);
7e80: 20 2f 2a 20 28 70 4d 65 6d 2d 3e 6e 2d 31 29 2a   /* (pMem->n-1)*
7e90: 32 20 2b 20 31 33 20 2a 2f 0a 20 20 7d 0a 20 20  2 + 13 */.  }.  
7ea0: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 42 6c  if( flags&MEM_Bl
7eb0: 6f 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ob ){.    return
7ec0: 20 28 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 32   (pMem->n*2 + 12
7ed0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7ee0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
7ef0: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
7f00: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
7f10: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
7f20: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
7f30: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
7f40: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
7f50: 65 4c 65 6e 28 75 36 34 20 73 65 72 69 61 6c 5f  eLen(u64 serial_
7f60: 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  type){.  assert(
7f70: 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 20   serial_type!=0 
7f80: 29 3b 0a 20 20 73 77 69 74 63 68 28 73 65 72 69  );.  switch(seri
7f90: 61 6c 5f 74 79 70 65 29 7b 0a 20 20 20 20 63 61  al_type){.    ca
7fa0: 73 65 20 36 3a 20 72 65 74 75 72 6e 20 30 3b 20  se 6: return 0; 
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
7fd0: 63 61 73 65 20 31 3a 20 72 65 74 75 72 6e 20 31  case 1: return 1
7fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ff0: 20 20 20 2f 2a 20 31 20 62 79 74 65 20 69 6e 74     /* 1 byte int
8000: 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
8010: 20 32 3a 20 72 65 74 75 72 6e 20 32 3b 20 20 20   2: return 2;   
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8030: 2a 20 32 20 62 79 74 65 20 69 6e 74 65 67 65 72  * 2 byte integer
8040: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 33 3a 20   */.    case 3: 
8050: 72 65 74 75 72 6e 20 34 3b 20 20 20 20 20 20 20  return 4;       
8060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20             /* 4 
8070: 62 79 74 65 20 69 6e 74 65 67 65 72 20 2a 2f 0a  byte integer */.
8080: 20 20 20 20 63 61 73 65 20 34 3a 20 72 65 74 75      case 4: retu
8090: 72 6e 20 38 3b 20 20 20 20 20 20 20 20 20 20 20  rn 8;           
80a0: 20 20 20 20 20 20 20 2f 2a 20 38 20 62 79 74 65         /* 8 byte
80b0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
80c0: 63 61 73 65 20 35 3a 20 72 65 74 75 72 6e 20 38  case 5: return 8
80d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
80e0: 20 20 20 2f 2a 20 38 20 62 79 74 65 20 66 6c 6f     /* 8 byte flo
80f0: 61 74 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  at */.  }.  asse
8100: 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  rt( serial_type>
8110: 3d 31 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =12 );.  return 
8120: 28 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32  ((serial_type-12
8130: 29 3e 3e 31 29 3b 20 20 20 20 20 20 20 20 2f 2a  )>>1);        /*
8140: 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 2a 2f   text or blob */
8150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
8160: 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
8170: 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
8180: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
8190: 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
81a0: 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
81b0: 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
81c0: 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
81d0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
81e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
81f0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8200: 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 0a 69 6e 74  written..*/ .int
8210: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
8220: 61 6c 50 75 74 28 75 6e 73 69 67 6e 65 64 20 63  alPut(unsigned c
8230: 68 61 72 20 2a 62 75 66 2c 20 63 6f 6e 73 74 20  har *buf, const 
8240: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 75 36  Mem *pMem){.  u6
8250: 34 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  4 serial_type = 
8260: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
8270: 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a 20 20 69  lType(pMem);.  i
8280: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72  nt len;..  asser
8290: 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  t( serial_type!=
82a0: 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 4e 55 4c 4c  0 );. .  /* NULL
82b0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
82c0: 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
82d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 0a  return 0;.  }. .
82e0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 2a 2f 0a    /* Integer */.
82f0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
8300: 65 3c 35 20 29 7b 0a 20 20 20 20 69 36 34 20 69  e<5 ){.    i64 i
8310: 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20   = pMem->i;.    
8320: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62  len = sqlite3Vdb
8330: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
8340: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
8350: 20 77 68 69 6c 65 28 20 6c 65 6e 2d 2d 20 29 7b   while( len-- ){
8360: 0a 20 20 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20  .      buf[len] 
8370: 3d 20 28 69 26 30 78 46 46 29 3b 0a 20 20 20 20  = (i&0xFF);.    
8380: 20 20 69 20 3d 20 69 20 3e 3e 20 38 3b 0a 20 20    i = i >> 8;.  
8390: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73    }.    return s
83a0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
83b0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
83c0: 79 70 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ype);.  }..  /* 
83d0: 46 6c 6f 61 74 20 2a 2f 0a 20 20 69 66 28 20 73  Float */.  if( s
83e0: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 35 20 29 7b  erial_type==5 ){
83f0: 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 62 79  .    /* TODO: by
8400: 74 65 20 6f 72 64 65 72 69 6e 67 3f 20 2a 2f 0a  te ordering? */.
8410: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
8420: 6f 66 28 64 6f 75 62 6c 65 29 3d 3d 38 20 29 3b  of(double)==8 );
8430: 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
8440: 20 26 70 4d 65 6d 2d 3e 72 2c 20 38 29 3b 0a 20   &pMem->r, 8);. 
8450: 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 7d     return 8;.  }
8460: 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20  .  .  /* String 
8470: 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73  or blob */.  ass
8480: 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
8490: 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20  >=12 );.  len = 
84a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
84b0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
84c0: 74 79 70 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  type);.  memcpy(
84d0: 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
84e0: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e  n);.  return len
84f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  ;.}../*.** Deser
8500: 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
8510: 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
8520: 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
8530: 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
8540: 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
8550: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
8560: 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
8570: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
8580: 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ead..*/ .int sql
8590: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
85a0: 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  t(const unsigned
85b0: 20 63 68 61 72 20 2a 62 75 66 2c 20 75 36 34 20   char *buf, u64 
85c0: 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 4d 65 6d  serial_type, Mem
85d0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 6c   *pMem){.  int l
85e0: 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  en;..  assert( s
85f0: 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 20 29 3b  erial_type!=0 );
8600: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 4d  ..  /* memset(pM
8610: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4d  em, 0, sizeof(pM
8620: 65 6d 29 29 3b 20 2a 2f 0a 20 20 70 4d 65 6d 2d  em)); */.  pMem-
8630: 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4d  >flags = 0;.  pM
8640: 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 0a 20 20 2f 2a  em->z = 0;..  /*
8650: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 73   NULL */.  if( s
8660: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
8670: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
8680: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
8690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
86a0: 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 2a 2f  .  /* Integer */
86b0: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
86c0: 70 65 3c 35 20 29 7b 0a 20 20 20 20 69 36 34 20  pe<5 ){.    i64 
86d0: 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  i = 0;.    int n
86e0: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
86f0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
8700: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
8710: 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 75 66 5b  );..    if( buf[
8720: 30 5d 26 30 78 38 30 20 29 7b 0a 20 20 20 20 20  0]&0x80 ){.     
8730: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 28 38 2d 6c   for(n=0; n<(8-l
8740: 65 6e 29 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  en); n++){.     
8750: 20 20 20 69 20 3d 20 28 69 3c 3c 38 29 2b 30 78     i = (i<<8)+0x
8760: 46 46 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  FF;.      }.    
8770: 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  }.    for(n=0; n
8780: 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  <len; n++){.    
8790: 20 20 69 20 3d 20 69 20 3c 3c 20 38 3b 0a 20 20    i = i << 8;.  
87a0: 20 20 20 20 69 20 3d 20 69 20 2b 20 62 75 66 5b      i = i + buf[
87b0: 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  n];.    }.    pM
87c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
87d0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69  Int;.    pMem->i
87e0: 20 3d 20 69 3b 0a 20 20 20 20 72 65 74 75 72 6e   = i;.    return
87f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
8800: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
8810: 5f 74 79 70 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _type);.  }..  /
8820: 2a 20 46 6c 6f 61 74 20 2a 2f 0a 20 20 69 66 28  * Float */.  if(
8830: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 35 20   serial_type==5 
8840: 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
8850: 62 79 74 65 20 6f 72 64 65 72 69 6e 67 3f 20 2a  byte ordering? *
8860: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
8870: 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d 38 20  zeof(double)==8 
8880: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
8890: 4d 65 6d 2d 3e 72 2c 20 62 75 66 2c 20 38 29 3b  Mem->r, buf, 8);
88a0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
88b0: 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20   = MEM_Real;.   
88c0: 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 7d 0a 20   return 8;.  }. 
88d0: 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72   .  /* String or
88e0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73 65 72   blob */.  asser
88f0: 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  t( serial_type>=
8900: 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  12 );.  len = sq
8910: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
8920: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
8930: 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
8940: 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
8950: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8960: 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 70 4d   MEM_Str;.    pM
8970: 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 2b 31 3b 0a 20  em->n = len+1;. 
8980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d   }else{.    pMem
8990: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
89a0: 6f 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ob;.    pMem->n 
89b0: 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  = len;.  }..  if
89c0: 28 20 28 70 4d 65 6d 2d 3e 6e 29 3e 4e 42 46 53  ( (pMem->n)>NBFS
89d0: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   ){.    pMem->z 
89e0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
89f0: 77 28 20 70 4d 65 6d 2d 3e 6e 20 29 3b 0a 20 20  w( pMem->n );.  
8a00: 20 20 69 66 28 20 21 70 4d 65 6d 2d 3e 7a 20 29    if( !pMem->z )
8a10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
8a20: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  1;.    }.    pMe
8a30: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  m->flags |= MEM_
8a40: 44 79 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Dyn;.  }else{.  
8a50: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d    pMem->z = pMem
8a60: 2d 3e 7a 53 68 6f 72 74 3b 0a 20 20 20 20 70 4d  ->zShort;.    pM
8a70: 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  em->flags |= MEM
8a80: 5f 53 68 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 6d  _Short;.  }..  m
8a90: 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20 62  emcpy(pMem->z, b
8aa0: 75 66 2c 20 6c 65 6e 29 3b 20 0a 20 20 69 66 28  uf, len); .  if(
8ab0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d   pMem->flags&MEM
8ac0: 5f 53 74 72 20 29 7b 0a 20 20 20 20 70 4d 65 6d  _Str ){.    pMem
8ad0: 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ->z[len] = '\0';
8ae0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6c  .  }..  return l
8af0: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  en;.}../*.** Com
8b00: 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
8b10: 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
8b20: 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
8b30: 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
8b40: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
8b50: 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
8b60: 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
8b70: 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
8b80: 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
8b90: 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
8ba0: 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
8bb0: 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
8bc0: 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
8bd0: 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
8be0: 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
8bf0: 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
8c00: 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
8c10: 20 6d 65 6d 63 6d 70 28 29 20 61 6e 64 0a 2a 2a   memcmp() and.**
8c20: 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
8c30: 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
8c40: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
8c50: 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
8c60: 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
8c70: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
8c80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8c90: 4d 65 6d 43 6f 6d 70 61 72 65 28 4d 65 6d 20 2a  MemCompare(Mem *
8ca0: 70 4d 65 6d 31 2c 20 4d 65 6d 20 2a 70 4d 65 6d  pMem1, Mem *pMem
8cb0: 32 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  2){.  int rc;.  
8cc0: 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
8cd0: 67 73 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67  gs = pMem1->flag
8ce0: 73 7c 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 20  s|pMem2->flags; 
8cf0: 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
8d00: 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
8d10: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
8d20: 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
8d30: 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
8d40: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
8d50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
8d60: 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
8d70: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
8d80: 6e 20 28 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 26  n (pMem2->flags&
8d90: 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 70 4d 65  MEM_Null) - (pMe
8da0: 6d 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  m1->flags&MEM_Nu
8db0: 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ll);.  }..  /* I
8dc0: 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
8dd0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
8de0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68  other is not, th
8df0: 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
8e00: 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
8e10: 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70  re numbers, comp
8e20: 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20  are as reals if 
8e30: 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f  one is a real, o
8e40: 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20  r as integers.  
8e50: 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65  ** if both value
8e60: 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a  s are integers..
8e70: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
8e80: 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
8e90: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
8ea0: 20 20 20 20 69 36 34 20 64 69 66 66 3b 0a 20 20      i64 diff;.  
8eb0: 20 20 69 66 28 20 21 28 70 4d 65 6d 31 2d 3e 66    if( !(pMem1->f
8ec0: 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  lags&(MEM_Int|ME
8ed0: 4d 5f 52 65 61 6c 29 29 20 29 7b 0a 20 20 20 20  M_Real)) ){.    
8ee0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
8ef0: 7d 0a 20 20 20 20 69 66 28 20 21 28 70 4d 65 6d  }.    if( !(pMem
8f00: 32 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  2->flags&(MEM_In
8f10: 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 20 29 7b 0a  t|MEM_Real)) ){.
8f20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
8f30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
8f40: 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
8f50: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
8f60: 69 66 28 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  if( pMem1->flags
8f70: 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
8f80: 20 20 20 20 70 4d 65 6d 31 2d 3e 72 20 3d 20 70      pMem1->r = p
8f90: 4d 65 6d 31 2d 3e 69 3b 0a 20 20 20 20 20 20 7d  Mem1->i;.      }
8fa0: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 32  .      if( pMem2
8fb0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
8fc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 32  ){.        pMem2
8fd0: 2d 3e 72 20 3d 20 70 4d 65 6d 32 2d 3e 69 3b 0a  ->r = pMem2->i;.
8fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8ff0: 28 20 70 4d 65 6d 31 2d 3e 72 20 3c 20 70 4d 65  ( pMem1->r < pMe
9000: 6d 32 2d 3e 72 20 29 20 72 65 74 75 72 6e 20 2d  m2->r ) return -
9010: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
9020: 6d 31 2d 3e 72 20 3e 20 70 4d 65 6d 32 2d 3e 72  m1->r > pMem2->r
9030: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
9040: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
9050: 20 7d 0a 20 20 20 20 64 69 66 66 20 3d 20 70 4d   }.    diff = pM
9060: 65 6d 31 2d 3e 69 20 2d 20 70 4d 65 6d 32 2d 3e  em1->i - pMem2->
9070: 69 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 64 69  i;.    return di
9080: 66 66 3c 30 20 3f 20 2d 31 20 3a 20 64 69 66 66  ff<0 ? -1 : diff
9090: 3d 3d 30 20 3f 20 30 20 3a 20 2b 31 3b 0a 20 20  ==0 ? 0 : +1;.  
90a0: 7d 0a 0a 20 20 72 63 20 3d 20 28 70 4d 65 6d 32  }..  rc = (pMem2
90b0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ->flags&MEM_Null
90c0: 29 20 2d 20 28 70 4d 65 6d 31 2d 3e 66 6c 61 67  ) - (pMem1->flag
90d0: 73 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 69  s&MEM_Null);.  i
90e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
90f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
9100: 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
9110: 73 74 20 62 65 20 73 74 72 69 6e 67 73 20 6f 72  st be strings or
9120: 20 62 6c 6f 62 73 2e 20 49 66 20 6f 6e 6c 79 20   blobs. If only 
9130: 6f 6e 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c  one is a string,
9140: 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 61 74 20   then.  ** that 
9150: 76 61 6c 75 65 20 69 73 20 6c 65 73 73 2e 20 4f  value is less. O
9160: 74 68 65 72 77 69 73 65 2c 20 63 6f 6d 70 61 72  therwise, compar
9170: 65 20 77 69 74 68 20 6d 65 6d 63 6d 70 28 29 2e  e with memcmp().
9180: 20 49 66 20 6d 65 6d 63 6d 70 28 29 0a 20 20 2a   If memcmp().  *
9190: 2a 20 72 65 74 75 72 6e 73 20 30 20 61 6e 64 20  * returns 0 and 
91a0: 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 6c 6f 6e  one value is lon
91b0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ger than the oth
91c0: 65 72 2c 20 74 68 65 6e 20 74 68 61 74 20 76 61  er, then that va
91d0: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 67 72 65 61  lue.  ** is grea
91e0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ter..  */.  rc =
91f0: 20 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a   memcmp(pMem1->z
9200: 2c 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65  , pMem2->z, (pMe
9210: 6d 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f  m1->n>pMem2->n)?
9220: 70 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e  pMem2->n:pMem1->
9230: 6e 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  n);.  if( rc ){.
9240: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9250: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4d   }..  return (pM
9260: 65 6d 31 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e  em1->n - pMem2->
9270: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  n);.}../*.** The
9280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68   following is th
9290: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
92a0: 63 74 69 6f 6e 20 66 6f 72 20 28 6e 6f 6e 2d 69  ction for (non-i
92b0: 6e 74 65 67 65 72 29 0a 2a 2a 20 6b 65 79 73 20  nteger).** keys 
92c0: 69 6e 20 74 68 65 20 62 74 72 65 65 73 2e 20 20  in the btrees.  
92d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
92e0: 74 75 72 6e 73 20 6e 65 67 61 74 69 76 65 2c 20  turns negative, 
92f0: 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69  zero, or.** posi
9300: 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
9310: 74 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68  t key is less th
9320: 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
9330: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
9340: 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2a 0a   the second..**.
9350: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9360: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 65 61   assumes that ea
9370: 63 68 20 6b 65 79 20 63 6f 6e 73 69 73 74 73 20  ch key consists 
9380: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  of one or more t
9390: 79 70 65 2f 62 6c 6f 62 0a 2a 2a 20 70 61 69 72  ype/blob.** pair
93a0: 73 2c 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67  s, encoded using
93b0: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
93c0: 53 65 72 69 61 6c 58 58 58 28 29 20 66 75 6e 63  SerialXXX() func
93d0: 74 69 6f 6e 73 20 61 62 6f 76 65 2e 20 0a 2a 2a  tions above. .**
93e0: 0a 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** Following th
93f0: 65 20 74 79 70 65 2f 62 6c 6f 62 20 70 61 69 72  e type/blob pair
9400: 73 2c 20 65 61 63 68 20 6b 65 79 20 6d 61 79 20  s, each key may 
9410: 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 30 78  have a single 0x
9420: 30 30 20 62 79 74 65 0a 2a 2a 20 66 6f 6c 6c 6f  00 byte.** follo
9430: 77 65 64 20 62 79 20 61 20 76 61 72 69 6e 74 2e  wed by a varint.
9440: 20 41 20 6b 65 79 20 6d 61 79 20 6f 6e 6c 79 20   A key may only 
9450: 68 61 76 65 20 74 68 69 73 20 74 72 61 6c 69 6e  have this tralin
9460: 67 20 30 78 30 30 2f 76 61 72 69 6e 74 0a 2a 2a  g 0x00/varint.**
9470: 20 70 61 69 72 20 69 66 20 69 74 20 68 61 73 20   pair if it has 
9480: 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
9490: 20 74 79 70 65 2f 62 6c 6f 62 20 70 61 69 72 73   type/blob pairs
94a0: 20 61 73 20 74 68 65 20 6b 65 79 20 69 74 20 69   as the key it i
94b0: 73 20 62 65 69 6e 67 0a 2a 2a 20 63 6f 6d 70 61  s being.** compa
94c0: 72 65 64 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  red to..*/.int s
94d0: 71 6c 69 74 65 33 56 64 62 65 4b 65 79 43 6f 6d  qlite3VdbeKeyCom
94e0: 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 75 73  pare(.  void *us
94f0: 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b  erData,.  int nK
9500: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
9510: 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e  *pKey1, .  int n
9520: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
9530: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 43 75 72   *pKey2.){.  Cur
9540: 73 6f 72 20 2a 70 43 20 3d 20 28 43 75 72 73 6f  sor *pC = (Curso
9550: 72 20 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20  r *)userData;.  
9560: 69 6e 74 20 6f 66 66 73 65 74 31 20 3d 20 30 3b  int offset1 = 0;
9570: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 32 20 3d  .  int offset2 =
9580: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
9590: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
95a0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
95b0: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
95c0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
95d0: 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20  d char *aKey2 = 
95e0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
95f0: 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 20 20  char *)pKey2;.  
9600: 0a 20 20 77 68 69 6c 65 28 20 6f 66 66 73 65 74  .  while( offset
9610: 31 3c 6e 4b 65 79 31 20 26 26 20 6f 66 66 73 65  1<nKey1 && offse
9620: 74 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20  t2<nKey2 ){.    
9630: 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 20 20 4d 65  Mem mem1;.    Me
9640: 6d 20 6d 65 6d 32 3b 0a 20 20 20 20 75 36 34 20  m mem2;.    u64 
9650: 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20  serial_type1;.  
9660: 20 20 75 36 34 20 73 65 72 69 61 6c 5f 74 79 70    u64 serial_typ
9670: 65 32 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  e2;.    int rc;.
9680: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
9690: 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
96a0: 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
96b0: 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
96c0: 2a 2f 0a 20 20 20 20 6f 66 66 73 65 74 31 20 2b  */.    offset1 +
96d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
96e0: 6e 74 28 26 61 4b 65 79 31 5b 6f 66 66 73 65 74  nt(&aKey1[offset
96f0: 31 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65  1], &serial_type
9700: 31 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 32 20  1);.    offset2 
9710: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
9720: 69 6e 74 28 26 61 4b 65 79 32 5b 6f 66 66 73 65  int(&aKey2[offse
9730: 74 32 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70  t2], &serial_typ
9740: 65 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  e2);..    /* If 
9750: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 76 61  either of the va
9760: 72 69 6e 74 73 20 6a 75 73 74 20 72 65 61 64 20  rints just read 
9770: 69 6e 20 61 72 65 20 30 20 28 6e 6f 74 20 61 20  in are 0 (not a 
9780: 74 79 70 65 29 2c 20 74 68 65 6e 0a 20 20 20 20  type), then.    
9790: 2a 2a 20 74 68 69 73 20 69 73 20 74 68 65 20 65  ** this is the e
97a0: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 73 2e 20  nd of the keys. 
97b0: 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 64 61  The remaining da
97c0: 74 61 20 69 6e 20 65 61 63 68 20 6b 65 79 20 69  ta in each key i
97d0: 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 72  s.    ** the var
97e0: 69 6e 74 20 72 6f 77 69 64 2e 20 43 6f 6d 70 61  int rowid. Compa
97f0: 72 65 20 74 68 65 73 65 20 61 73 20 73 69 67 6e  re these as sign
9800: 65 64 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  ed integers and 
9810: 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68  return.    ** th
9820: 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  e result..    */
9830: 0a 20 20 20 20 69 66 28 20 21 73 65 72 69 61 6c  .    if( !serial
9840: 5f 74 79 70 65 31 20 7c 7c 20 21 73 65 72 69 61  _type1 || !seria
9850: 6c 5f 74 79 70 65 32 20 29 7b 0a 20 20 20 20 20  l_type2 ){.     
9860: 20 61 73 73 65 72 74 28 20 21 73 65 72 69 61 6c   assert( !serial
9870: 5f 74 79 70 65 31 20 26 26 20 21 73 65 72 69 61  _type1 && !seria
9880: 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 20  l_type2 );.     
9890: 20 61 73 73 65 72 74 28 20 21 70 43 20 7c 7c 20   assert( !pC || 
98a0: 21 70 43 2d 3e 69 6e 63 72 4b 65 79 20 29 3b 0a  !pC->incrKey );.
98b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
98c0: 56 61 72 69 6e 74 28 26 61 4b 65 79 31 5b 6f 66  Varint(&aKey1[of
98d0: 66 73 65 74 31 5d 2c 20 26 73 65 72 69 61 6c 5f  fset1], &serial_
98e0: 74 79 70 65 31 29 3b 0a 20 20 20 20 20 20 73 71  type1);.      sq
98f0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
9900: 61 4b 65 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20  aKey2[offset2], 
9910: 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a  &serial_type2);.
9920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 20 28        return ( (
9930: 69 36 34 29 73 65 72 69 61 6c 5f 74 79 70 65 31  i64)serial_type1
9940: 20 2d 20 28 69 36 34 29 73 65 72 69 61 6c 5f 74   - (i64)serial_t
9950: 79 70 65 32 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  ype2 );.    }.. 
9960: 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
9970: 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
9980: 68 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  h space left in 
9990: 65 61 63 68 20 6b 65 79 20 66 6f 72 20 74 68 65  each key for the
99a0: 20 62 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20   blob of.    ** 
99b0: 64 61 74 61 20 74 6f 20 67 6f 20 77 69 74 68 20  data to go with 
99c0: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
99d0: 6a 75 73 74 20 72 65 61 64 2e 20 54 68 69 73 20  just read. This 
99e0: 61 73 73 65 72 74 20 6d 61 79 20 66 61 69 6c 20  assert may fail 
99f0: 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  if.    ** the fi
9a00: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  le is corrupted.
9a10: 20 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20    Then read the 
9a20: 76 61 6c 75 65 20 66 72 6f 6d 20 65 61 63 68 20  value from each 
9a30: 6b 65 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20  key into mem1.  
9a40: 20 20 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65    ** and mem2 re
9a50: 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20  spectively..    
9a60: 2a 2f 0a 20 20 20 20 6f 66 66 73 65 74 31 20 2b  */.    offset1 +
9a70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
9a80: 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 6f 66  ialGet(&aKey1[of
9a90: 66 73 65 74 31 5d 2c 20 73 65 72 69 61 6c 5f 74  fset1], serial_t
9aa0: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
9ab0: 20 20 6f 66 66 73 65 74 32 20 2b 3d 20 73 71 6c    offset2 += sql
9ac0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
9ad0: 74 28 26 61 4b 65 79 32 5b 6f 66 66 73 65 74 32  t(&aKey2[offset2
9ae0: 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 2c  ], serial_type2,
9af0: 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20 72 63   &mem2);..    rc
9b00: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
9b10: 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d  pare(&mem1, &mem
9b20: 32 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31  2);.    if( mem1
9b30: 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29  .flags&MEM_Dyn )
9b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
9b50: 65 65 28 6d 65 6d 31 2e 7a 29 3b 0a 20 20 20 20  ee(mem1.z);.    
9b60: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e 66  }.    if( mem2.f
9b70: 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a  lags&MEM_Dyn ){.
9b80: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
9b90: 28 6d 65 6d 32 2e 7a 29 3b 0a 20 20 20 20 7d 0a  (mem2.z);.    }.
9ba0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
9bb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
9bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9bd0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  * One of the key
9be0: 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
9bf0: 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  lds, but all the
9c00: 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
9c10: 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65  at point.  ** we
9c20: 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
9c30: 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73   incrKey flag is
9c40: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
9c50: 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20  second key is.  
9c60: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61  ** treated as la
9c70: 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rger..  */.  if(
9c80: 20 70 43 20 26 26 20 70 43 2d 3e 69 6e 63 72 4b   pC && pC->incrK
9c90: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
9ca0: 28 20 6f 66 66 73 65 74 32 3d 3d 6e 4b 65 79 32  ( offset2==nKey2
9cb0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   );.    return -
9cc0: 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 66  1;.  }..  if( of
9cd0: 66 73 65 74 31 3c 6e 4b 65 79 31 20 29 7b 0a 20  fset1<nKey1 ){. 
9ce0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9cf0: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 32 3c 6e  .  if( offset2<n
9d00: 4b 65 79 32 20 29 7b 0a 20 20 20 20 72 65 74 75  Key2 ){.    retu
9d10: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  rn -1;.  }..  re
9d20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9d30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
9d40: 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
9d50: 74 61 62 6c 65 20 72 6f 77 20 72 65 63 6f 72 64  table row record
9d60: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0a  s specified by .
9d70: 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  ** {nKey1, pKey1
9d80: 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b  } and {nKey2, pK
9d90: 65 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20  ey2}, returning 
9da0: 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
9db0: 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
9dc0: 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79  integer if {nKey
9dd0: 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73  1, pKey1} is les
9de0: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
9df0: 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
9e00: 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65  than {nKey2, pKe
9e10: 79 32 7d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  y2}..**.** This 
9e20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 72 65 74  function is pret
9e30: 74 79 20 69 6e 65 66 66 69 63 69 65 6e 74 20 61  ty inefficient a
9e40: 6e 64 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  nd will probably
9e50: 20 62 65 20 72 65 70 6c 61 63 65 64 0a 2a 2a 20   be replaced.** 
9e60: 62 79 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73  by something els
9e70: 65 20 69 6e 20 74 68 65 20 6e 65 61 72 20 66 75  e in the near fu
9e80: 74 75 72 65 2e 20 49 74 20 69 73 20 63 75 72 72  ture. It is curr
9e90: 65 6e 74 6c 79 20 72 65 71 75 69 72 65 64 0a 2a  ently required.*
9ea0: 2a 20 62 79 20 63 6f 6d 70 6f 75 6e 64 20 53 45  * by compound SE
9eb0: 4c 45 43 54 20 6f 70 65 72 61 74 6f 72 73 2e 20  LECT operators. 
9ec0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
9ed0: 64 62 65 52 6f 77 43 6f 6d 70 61 72 65 28 0a 20  dbeRowCompare(. 
9ee0: 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c   void *userData,
9ef0: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
9f00: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
9f10: 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63   .  int nKey2, c
9f20: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
9f30: 0a 29 7b 0a 20 20 43 75 72 73 6f 72 20 2a 70 43  .){.  Cursor *pC
9f40: 20 3d 20 28 43 75 72 73 6f 72 20 2a 29 75 73 65   = (Cursor *)use
9f50: 72 44 61 74 61 3b 0a 20 20 69 6e 74 20 6f 66 66  rData;.  int off
9f60: 73 65 74 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  set1 = 0;.  int 
9f70: 6f 66 66 73 65 74 32 20 3d 20 30 3b 0a 20 20 69  offset2 = 0;.  i
9f80: 6e 74 20 74 6f 66 66 73 65 74 31 20 3d 20 30 3b  nt toffset1 = 0;
9f90: 0a 20 20 69 6e 74 20 74 6f 66 66 73 65 74 32 20  .  int toffset2 
9fa0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
9fb0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9fc0: 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
9fd0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
9fe0: 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e  r *)pKey1;.  con
9ff0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
a000: 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74   *aKey2 = (const
a010: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a020: 29 70 4b 65 79 32 3b 0a 0a 20 20 61 73 73 65 72  )pKey2;..  asser
a030: 74 28 20 70 43 20 29 3b 0a 20 20 61 73 73 65 72  t( pC );.  asser
a040: 74 28 20 70 43 2d 3e 6e 46 69 65 6c 64 3e 30 20  t( pC->nField>0 
a050: 29 3b 0a 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  );..  for( i=0; 
a060: 69 3c 70 43 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  i<pC->nField; i+
a070: 2b 20 29 7b 0a 20 20 20 20 75 36 34 20 64 75 6d  + ){.    u64 dum
a080: 6d 79 3b 0a 20 20 20 20 6f 66 66 73 65 74 31 20  my;.    offset1 
a090: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
a0a0: 69 6e 74 28 26 61 4b 65 79 31 5b 6f 66 66 73 65  int(&aKey1[offse
a0b0: 74 31 5d 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  t1], &dummy);.  
a0c0: 20 20 6f 66 66 73 65 74 32 20 2b 3d 20 73 71 6c    offset2 += sql
a0d0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
a0e0: 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d 2c 20 26  Key1[offset1], &
a0f0: 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 0a 20 20 66  dummy);.  }..  f
a100: 6f 72 28 20 69 3d 30 3b 20 69 3c 70 43 2d 3e 6e  or( i=0; i<pC->n
a110: 46 69 65 6c 64 3b 20 69 2b 2b 20 29 7b 0a 20 20  Field; i++ ){.  
a120: 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 20 20    Mem mem1;.    
a130: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 20 20 75 36  Mem mem2;.    u6
a140: 34 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  4 serial_type1;.
a150: 20 20 20 20 75 36 34 20 73 65 72 69 61 6c 5f 74      u64 serial_t
a160: 79 70 65 32 3b 0a 20 20 20 20 69 6e 74 20 72 63  ype2;.    int rc
a170: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
a180: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
a190: 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
a1a0: 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
a1b0: 2e 20 2a 2f 0a 20 20 20 20 74 6f 66 66 73 65 74  . */.    toffset
a1c0: 31 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  1 += sqlite3GetV
a1d0: 61 72 69 6e 74 28 26 61 4b 65 79 31 5b 74 6f 66  arint(&aKey1[tof
a1e0: 66 73 65 74 31 5d 2c 20 26 73 65 72 69 61 6c 5f  fset1], &serial_
a1f0: 74 79 70 65 31 29 3b 0a 20 20 20 20 74 6f 66 66  type1);.    toff
a200: 73 65 74 32 20 2b 3d 20 73 71 6c 69 74 65 33 47  set2 += sqlite3G
a210: 65 74 56 61 72 69 6e 74 28 26 61 4b 65 79 32 5b  etVarint(&aKey2[
a220: 74 6f 66 66 73 65 74 32 5d 2c 20 26 73 65 72 69  toffset2], &seri
a230: 61 6c 5f 74 79 70 65 32 29 3b 0a 0a 20 20 20 20  al_type2);..    
a240: 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
a250: 79 70 65 31 20 26 26 20 73 65 72 69 61 6c 5f 74  ype1 && serial_t
a260: 79 70 65 32 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ype2 );..    /* 
a270: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 72  Assert that ther
a280: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
a290: 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68 20 6b  e left in each k
a2a0: 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20  ey for the blob 
a2b0: 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 74  of.    ** data t
a2c0: 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20 73 65  o go with the se
a2d0: 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74 20 72  rial type just r
a2e0: 65 61 64 2e 20 54 68 69 73 20 61 73 73 65 72 74  ead. This assert
a2f0: 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 20 20   may fail if.   
a300: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20   ** the file is 
a310: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 6e  corrupted.  Then
a320: 20 72 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   read the value 
a330: 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 69 6e  from each key in
a340: 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61  to mem1.    ** a
a350: 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63 74 69  nd mem2 respecti
a360: 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vely..    */.   
a370: 20 6f 66 66 73 65 74 31 20 2b 3d 20 73 71 6c 69   offset1 += sqli
a380: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
a390: 28 26 61 4b 65 79 31 5b 6f 66 66 73 65 74 31 5d  (&aKey1[offset1]
a3a0: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
a3b0: 26 6d 65 6d 31 29 3b 0a 20 20 20 20 6f 66 66 73  &mem1);.    offs
a3c0: 65 74 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64  et2 += sqlite3Vd
a3d0: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
a3e0: 79 32 5b 6f 66 66 73 65 74 32 5d 2c 20 73 65 72  y2[offset2], ser
a3f0: 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32  ial_type2, &mem2
a400: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  );..    rc = sql
a410: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
a420: 6d 65 6d 31 2c 20 26 6d 65 6d 32 29 3b 0a 20 20  mem1, &mem2);.  
a430: 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73    if( mem1.flags
a440: 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20  &MEM_Dyn ){.    
a450: 20 20 73 71 6c 69 74 65 46 72 65 65 28 6d 65 6d    sqliteFree(mem
a460: 31 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1.z);.    }.    
a470: 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73 26 4d  if( mem2.flags&M
a480: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
a490: 73 71 6c 69 74 65 46 72 65 65 28 6d 65 6d 32 2e  sqliteFree(mem2.
a4a0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
a4b0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
a4c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a4d0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
a4e0: 30 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  0;.}.  ../*.** p
a4f0: 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
a500: 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 52 65   index entry. Re
a510: 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 76 61  ad the rowid (va
a520: 72 69 6e 74 20 6f 63 63 75 72 69 6e 67 20 61 74  rint occuring at
a530: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
a540: 68 65 20 65 6e 74 72 79 20 61 6e 64 20 73 74 6f  he entry and sto
a550: 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
a560: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
a570: 4b 20 69 66 0a 2a 2a 20 65 76 65 72 79 74 68 69  K if.** everythi
a580: 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
a590: 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
a5a0: 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
a5b0: 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
a5c0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
a5d0: 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
a5e0: 69 36 34 20 73 7a 3b 0a 20 20 69 6e 74 20 72 63  i64 sz;.  int rc
a5f0: 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 5d  ;.  char buf[10]
a600: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 75  ;.  int len;.  u
a610: 36 34 20 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71  64 r;..  rc = sq
a620: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
a630: 65 28 70 43 75 72 2c 20 26 73 7a 29 3b 0a 20 20  e(pCur, &sz);.  
a640: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a650: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
a660: 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 20 3d 20  rc;.  }.  len = 
a670: 28 28 73 7a 3e 31 30 29 3f 31 30 3a 73 7a 29 3b  ((sz>10)?10:sz);
a680: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
a690: 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 32 20  are less than 2 
a6a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
a6b0: 2c 20 74 68 69 73 20 63 61 6e 6e 6f 74 20 62 65  , this cannot be
a6c0: 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 69 6e  .  ** a valid in
a6d0: 64 65 78 20 65 6e 74 72 79 2e 20 49 6e 20 70 72  dex entry. In pr
a6e0: 61 63 74 69 63 65 20 74 68 69 73 20 63 6f 6d 65  actice this come
a6f0: 73 20 75 70 20 66 6f 72 20 61 20 71 75 65 72 79  s up for a query
a700: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 6f 72  .  ** of the sor
a710: 74 20 22 53 45 4c 45 43 54 20 6d 61 78 28 78 29  t "SELECT max(x)
a720: 20 46 52 4f 4d 20 74 31 3b 22 20 77 68 65 6e 20   FROM t1;" when 
a730: 74 31 20 69 73 20 61 6e 20 65 6d 70 74 79 20 74  t1 is an empty t
a740: 61 62 6c 65 0a 20 20 2a 2a 20 77 69 74 68 20 61  able.  ** with a
a750: 6e 20 69 6e 64 65 78 20 6f 6e 20 78 2e 20 49 6e  n index on x. In
a760: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
a770: 63 61 6c 6c 20 74 68 65 20 72 6f 77 69 64 20 30  call the rowid 0
a780: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6e  ..  */.  if( len
a790: 3c 32 20 29 7b 0a 20 20 20 20 2a 72 6f 77 69 64  <2 ){.    *rowid
a7a0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
a7b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
a7c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
a7d0: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 73 7a  treeKey(pCur, sz
a7e0: 2d 6c 65 6e 2c 20 6c 65 6e 2c 20 62 75 66 29 3b  -len, len, buf);
a7f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a800: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
a810: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 6c 65  rn rc;.  }..  le
a820: 6e 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 62 75  n--;.  while( bu
a830: 66 5b 6c 65 6e 2d 31 5d 20 26 26 20 2d 2d 6c 65  f[len-1] && --le
a840: 6e 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  n );..  sqlite3G
a850: 65 74 56 61 72 69 6e 74 28 26 62 75 66 5b 6c 65  etVarint(&buf[le
a860: 6e 5d 2c 20 26 72 29 3b 0a 20 20 2a 72 6f 77 69  n], &r);.  *rowi
a870: 64 20 3d 20 72 3b 0a 20 20 72 65 74 75 72 6e 20  d = r;.  return 
a880: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a890: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
a8a0: 6b 65 79 20 6f 66 20 69 6e 64 65 78 20 65 6e 74  key of index ent
a8b0: 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
a8c0: 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
a8d0: 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
a8e0: 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
a8f0: 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
a900: 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
a910: 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
a920: 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
a930: 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
a940: 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
a950: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
a960: 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
a970: 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
a980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
a990: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 69 6e 74 20  success..*/.int 
a9a0: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
a9b0: 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73  yCompare(.  Curs
a9c0: 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
a9d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
a9e0: 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
a9f0: 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e   against */.  in
aa00: 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38  t nKey, const u8
aa10: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
aa20: 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
aa30: 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
aa60: 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
aa70: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  here */.){.  uns
aa80: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
aa90: 6c 4b 65 79 3b 0a 20 20 75 36 34 20 6e 43 65 6c  lKey;.  u64 nCel
aaa0: 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 66 72 65 65  lKey;.  int free
aab0: 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
aac0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e  nt rc;.  int len
aad0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
aae0: 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
aaf0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
ab00: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
ab10: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
ab20: 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
ab30: 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
ab40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ab50: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 65 6c 6c  OK;.  }..  pCell
ab60: 4b 65 79 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Key = (unsigned 
ab70: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 42 74  char *)sqlite3Bt
ab80: 72 65 65 4b 65 79 46 65 74 63 68 28 70 43 75 72  reeKeyFetch(pCur
ab90: 2c 20 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69  , nCellKey);.  i
aba0: 66 28 20 21 70 43 65 6c 6c 4b 65 79 20 29 7b 0a  f( !pCellKey ){.
abb0: 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
abc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
abd0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
abe0: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 69  nCellKey);.    i
abf0: 66 28 20 21 70 43 65 6c 6c 4b 65 79 20 29 7b 0a  f( !pCellKey ){.
ac00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ac10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
ac20: 0a 20 20 20 20 66 72 65 65 43 65 6c 6c 4b 65 79  .    freeCellKey
ac30: 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 1;.    rc = s
ac40: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
ac50: 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
ac60: 2c 20 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  , pCellKey);.   
ac70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac80: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ac90: 74 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  teFree(pCellKey)
aca0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
acb0: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20  c;.    }.  }. . 
acc0: 20 6c 65 6e 20 3d 20 6e 43 65 6c 6c 4b 65 79 2d   len = nCellKey-
acd0: 32 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 65 6c  2;.  while( pCel
ace0: 6c 4b 65 79 5b 6c 65 6e 5d 20 26 26 20 2d 2d 6c  lKey[len] && --l
acf0: 65 6e 20 29 3b 0a 0a 20 20 2a 72 65 73 20 3d 20  en );..  *res = 
ad00: 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 43 6f  sqlite3VdbeKeyCo
ad10: 6d 70 61 72 65 28 70 43 2c 20 6c 65 6e 2c 20 70  mpare(pC, len, p
ad20: 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  CellKey, nKey, p
ad30: 4b 65 79 29 3b 0a 20 20 0a 20 20 69 66 28 20 66  Key);.  .  if( f
ad40: 72 65 65 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20  reeCellKey ){.  
ad50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65    sqliteFree(pCe
ad60: 6c 6c 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  llKey);.  }.  re
ad70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ad80: 7d 0a                                            }.